您可以修改源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_html 或render_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 等于 file、age 和 awesome。