【问题标题】:Evaluate R Markdown Parameters via Quasiquotation & render Function通过 Quasiquotation & render 函数评估 R Markdown 参数
【发布时间】:2020-05-11 14:54:20
【问题描述】:

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

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

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

我在使用分组变量时遇到了麻烦。下面是一个可重现的示例。


这是get_count() 的函数定义。它接受一个输入数据集和一个分组变量,并返回分组变量的每个值的行数(例如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 的报价/整洁评估有关。我得到的最常见错误是Error: Quosures can only be unquoted within a quasiquotation context.

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

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

再次感谢!

【问题讨论】:

    标签: r r-markdown tidyeval


    【解决方案1】:

    当您致电 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
    

    【讨论】:

    • 非常感谢!这是我希望的有效示例!
    猜你喜欢
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    • 2023-03-12
    • 2015-12-01
    • 1970-01-01
    • 2020-04-15
    相关资源
    最近更新 更多