通过准引用和渲染函数评估 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 分组变量每个值的行数(例如 cut
或 clarity
)。
# 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
大家好,感谢您的宝贵时间。
我有一个非常具体的问题。我正在尝试以编程方式创建一个包含多个图表和摘要 table 的 PDF 文档,所有这些都是通过单个函数调用完成的。用户将更改函数中的各种参数,并创建一个新的 PDF 文档。新的 PDF 文件将包含各种自定义图表,这些图表也是通过函数创建的。
例如,用户将调用函数get_markdown_report()
。此函数将引用 Rmarkdown 文件 reprex.Rmd
。然后,此 Rmarkdown 文件将引用函数 get_count()
,其中 returns 摘要 table。最终结果将是一个包含摘要 table 的 PDF 文件,但最终用户可以定义输入数据集以及分组变量来创建摘要 table.
我在使用分组变量时遇到问题。下面是一个可重现的例子。
这是 get_count()
的函数定义。它需要一个输入数据集和一个分组变量,以及 returns 分组变量每个值的行数(例如 cut
或 clarity
)。
# 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