Rmarkdown参数覆盖全局列表

nkkqxpd9  于 2023-02-17  发布在  其他
关注(0)|答案(2)|浏览(122)

bounty将在6天后过期。回答此问题可获得+50的声誉奖励。Mike正在寻找来自声誉良好来源的答案

我在Rmarkdown中使用params。但是当使用参数并确保一切正常时,我在全局环境中将params重构为一个列表,并逐块运行文档以确保创建正确的报告,我遇到了一个问题,yaml中的params覆盖了全局环境中的列表。如果你运行第一个块而不编织它将创建一个参数列表值为6.然后如果你运行第二个块(ctrl + shift +enter)它将运行整个块。但是它将用yaml中的默认值覆盖params列表。但是当我逐行运行它时(ctrl + enter)这个问题不会发生。当我运行ctrl +shift +enter使列表被覆盖时会发生什么?
.qmd文件中也会出现这种情况。

---
title: "test"
author: "Michael"
output: html_document
params:
 id: "4"
---

```{r setup, include=TRUE}
knitr::opts_chunk$set(
    echo = FALSE,
    message = FALSE,
    warning = FALSE
)
params <- list(id = 6)
library(dplyr)
mtcars %>% 
    filter(cyl == params$id)
ncgqoxb0

ncgqoxb01#

在交互式会话中只运行params <- list(id = 6)就可以解决这个问题(在rmd和qmd文件中)。

---
 title: "test"
 author: "Michael"
 output: html_document
 params:
  id: "4"
 ---
 
 ```{r setup, include=TRUE}
 knitr::opts_chunk$set(
     echo = FALSE,
     message = FALSE,
     warning = FALSE
 )
 if (interactive()) params <- list(id = 6)
library(dplyr)
mtcars %>% 
    filter(cyl == params$id)

由于编织不是交互式的,因此忽略创建params对象。
由于chunk选项也获取代码并对其进行评估,您甚至可以为交互式会话运行特定的安装程序块,如下所示:

在旁注:如果没有这个条件,我甚至无法编织文件,因为我会遇到以下错误:

Quitting from lines 10-16 (test.qmd) 
Error in eval(expr, envir, enclos) : 
  cannot change value of locked binding for 'params'
wfveoks0

wfveoks02#

另一个不同的选择是在params块中使用eval=FALSE(编织时不运行),这样就可以使用yaml id编织它,但是如果想使用创建的param,可以运行这行代码:

---
title: "test"
author: "Michael"
output: html_document
params:
 id: "4"
---

```{r setup, include=TRUE, eval=FALSE}
knitr::opts_chunk$set(
    echo = FALSE,
    message = FALSE,
    warning = FALSE
)
params <- list(id = 6)
library(dplyr)
mtcars %>% 
    filter(cyl == params$id)

输出:

![](https://i.stack.imgur.com/0wP3o.png)

相关问题