通过准引用和渲染函数评估 R Markdown 参数

Evaluate R Markdown Parameters via Quasiquotation & render Function


大家好,感谢您的宝贵时间。

我有一个非常具体的问题。我正在尝试以编程方式创建一个包含多个图表和摘要 table 的 PDF 文档,所有这些都是通过单个函数调用完成的。用户将更改函数中的各种参数,并创建一个新的 PDF 文档。新的 PDF 文件将包含各种自定义图表,这些图表也是通过函数创建的。

例如,用户将调用函数get_markdown_report()。此函数将引用 Rmarkdown 文件 reprex.Rmd。然后,此 Rmarkdown 文件将引用函数 get_count(),其中 returns 摘要 table。最终结果将是一个包含摘要 table 的 PDF 文件,但最终用户可以定义输入数据集以及分组变量来创建摘要 table.

我在使用分组变量时遇到问题。下面是一个可重现的例子。


这是 get_count() 的函数定义。它需要一个输入数据集和一个分组变量,以及 returns 分组变量每个值的行数(例如 cutclarity)。

# Loading packages
library(tidyverse)


# Defining function
get_count <- function(data, group_var) {

  # Capturing grouping variable in quosure
  group_var <- enquo(group_var)

  # Determining count of rows per grouping variable
  data %>%
    group_by(!! group_var) %>% 
    summarize(count = n())

}

# Example usage:
# get_count(diamonds, cut)
# get_count(diamonds, clarity)

get_count() 然后在 R markdown 文件中调用以创建 PDF 文档。下面是 reprex.Rmd 的定义:

[注意:我在下面放了两个反引号而不是三个,这样 .Rmd 结构的格式会更好。]

---
title: "Reprex"
output: 
  pdf_document:
params: 
  data: data
  group_var: group_var

---

``{r, echo = FALSE, include = FALSE}

## Loading Packages -----------------------------------------------------------

library(tidyverse)
library(rmarkdown)
source("get_count.R")

``

A summary table is printed below:

``{r, echo = FALSE}

group_var <- enquo(params$group_var)

params$data %>%
  get_count(!! group_var)

``

最后,这个 Rmarkdown 文件将从函数 get_markdown_report() 中调用。用户可以定义输入数据集和分组变量,将创建不同的PDF文件。

# Loading packages
library(rmarkdown)

# Defining function
get_markdown_report <- function(data, group_var) {

  # Capturing grouping variable in quosure
  group_var <- enquo(group_var)

  # Rendering PDF markdown document
  render(
    input = "reprex.Rmd",
    params = 
      list(
        data = data, 
        group_var = !! group_var
      )
  )

}

但是,根据我的结构,我会遇到各种错误,所有错误都与 group_var 的 quotation/tidy 评估有关。我得到的最常见错误是 Error: Quosures can only be unquoted within a quasiquotation context.

我对 tidy evaluation 和 quotation 有点熟悉,但以前从未使用过它们来创建 R Markdown 文档。我认为问题是由于我在 get_markdown_report() 或 R Markdown 文件中引用分组变量的方式。

关于如何解决这个问题有什么建议吗?

再次感谢!

当您调用 render 时,请将您的 group_var 作为 quosure 传递。无需对其进行评估,只需让它立即在 .Rmd.

中重新引用

在get_markdown_report()

# Defining function
get_markdown_report <- function(data, group_var) {

  # Capturing grouping variable in quosure
  group_var <- rlang::enquo(group_var)       # <--- Added rlang:: scope resolution

  # Rendering PDF markdown document
  render(
    input = "reprex.Rmd",
    params =
      list(
        data = data,
        group_var = group_var                # <--- no !! evaluation, keep as quosure
      )
  )

}

在reprex.Rmd

我不得不在 .Rmd 中切换到使用三重反引号 (```) 以使其正确呈现:

```{r, echo = FALSE}            # <-- I can't get your double `` to render properly

group_var <- params$group_var   # <-- no enquo(), params$group_var is already a quosure

params$data %>%
  get_count(!! group_var)

```

测试

get_markdown_report( mtcars, cyl )    # Works as expected