【问题标题】:Replace variables with their corresponding values in source code chunk用源代码块中的对应值替换变量
【发布时间】:2017-04-29 18:39:25
【问题描述】:

我想在 R Markdown 输出中显示参数值而不是 params$...。例如,下面的第一个代码块在输出中显示params$file,但我想用samples.txt 替换它。我尝试使用message 添加第二个块,但它会输出一个白色代码块,我想要一个灰色背景,就像所有其他 R 代码块一样。

---
output: html_document
params:
   file: samples.txt
---

```{r read, message=FALSE, collapse=TRUE, comment=""}
x <- read_tsv(params$file)
x
```
This just needs a gray background
```{r print, echo=2, collapse=TRUE, comment=""}
message('x <- read_tsv("', params$file, '")')
x
```

【问题讨论】:

  • 当我尝试message('hello world ', params$file, '!') 时,它工作正常。否则,您的示例无法重现
  • 尝试更改回显选项。如果 echo=TRUE 块是灰色的,如果我设置 echo=FALSE 隐藏 params$file,块是白色的。

标签: r knitr r-markdown


【解决方案1】:

您可以修改源hook。根据您的需求量身定制的解决方案会立即出现。对于替换params 中所有元素的更通用的方法,请向下滚动。

---
output:
  pdf_document: default
  html_document: default
params:
  file: samples.txt
---


```{r, include=FALSE}
library(knitr)
library(stringr)
default_source_hook <- knit_hooks$get('source')

knit_hooks$set(source = function(x, options) {
  x <- str_replace_all(x, pattern = 'params\\$file', paste0("'",params$file,"'"))
  default_source_hook(x, options)
})
```

```{r print, echo=T, comment="", eval = T}
print(params$file)
```

首先,我们保存将根据输出文件类型(render_htmlrender_latex 等)使用的默认挂钩。然后我们更改源挂钩:我们将所有出现的params$file 替换为其值,然后将源代码放回我们之前保存的默认挂钩中。

在这种情况下,这会导致:

这个魔法很有效,因为我们只修改将要打印的源代码,而不是正在评估的源代码!


更新:更通用的方法

我对您的示例进行了一些尝试,并创建了一个更通用的钩子。它应该替换代码块中params$... 形式的所有元素。它甚至会检查值的类型,如果是字符值,则添加引号。

检查以下 MRE:

---
output:
  pdf_document: default
  html_document: default
params:
  file: samples.csv
  age: 28
  awesome: true
  34: badname
  _x: badname
---


```{r, include=FALSE}
library(knitr)
library(gsubfn)

default_source_hook <- knit_hooks$get('source')

knit_hooks$set(source = function(x, options) {
  x <- gsubfn(x = x, pattern = "params\\$`?([\\w_]+)`?", function(y) {
    y <- get(y, params)
    ifelse(is.character(y), paste0("'", y, "'"), y)
  })
  default_source_hook(x, options)
})
```

```{r print, echo=T, comment="", eval = T}
file <- params$file
age  <- params$age
awsm <- params$awesome
# dont name your variables like that! works though...
badexmpls <- c(params$`34`, params$`_x`)
```

我们利用gsubfn()。这个函数允许我们使用替换属性的函数(在常见的gsub 中是不可能的)。此函数采用找到的元素,但是,由于正则表达式,只有$ 之后的部分。所以在这个块中,y 等于 fileageawesome

【讨论】:

  • 谢谢,第一个示例对我有用,第二个带有gsubfn 的示例在我的 Mac 上打开 X11,然后 Rstudio 崩溃,但输出也是正确的。
  • 有趣。我也在 Mac 上,但这些都没有发生在我身上:D
  • 在新的 RStudio 会话中,只需键入 library(gsubfn) 即可加载所需的 proto 包,这会导致 XQuartz 打开(如果我保持打开它正常),因此 proto 包会导致问题。
  • 另外,is.character(v) 应该是 is.character(y) 在第二块?
  • 是的!错过了抱歉:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-10
  • 1970-01-01
  • 2012-02-07
  • 2016-03-05
  • 2012-11-05
  • 1970-01-01
相关资源
最近更新 更多