R 用源代码块中相应的值替换变量

R 用源代码块中相应的值替换变量,r,knitr,r-markdown,R,Knitr,R Markdown,我希望在R标记输出中显示参数值,而不是params$…。例如,下面的第一个代码块在输出中显示params$file,但我想将其替换为samples.txt。我尝试用message添加第二个代码块,但这会输出一个白色代码块,我希望像所有其他R代码块一样有一个灰色背景 --- output: html_document params: file: samples.txt --- ```{r read, message=FALSE, collapse=TRUE, comment=""} x &

我希望在R标记输出中显示参数值,而不是
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
```
---
输出:html\u文档
参数:
文件:samples.txt
---
```{r read,message=FALSE,collapse=TRUE,comment=”“}

x您可以修改源。根据您的需要量身定制的解决方案随即推出。对于替换
参数
中所有元素的更通用的方法,请向下滚动

---
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)
```
我们使用
gsubfn()
。此函数允许我们使用替换属性的函数(在通用
gsub
中不可能)。此函数接受找到的元素,但由于使用了regex,因此只接受
$
后面的部分。所以在这个区块中,
y
等于
file
age
awesome


当我尝试
消息('helloworld',params$file'!')
它工作正常。否则,您的示例不会重复更改echo选项。如果echo=TRUE,则区块为灰色,如果我将echo=FALSE设置为隐藏params$文件,则区块为白色。谢谢,第一个示例适用于我,第二个示例使用
gsubfn
在我的mac上打开X11,然后崩溃Rstudio,但输出也正确。有趣。我也在Mac上,但这一切都没有发生在我身上:在一个新的RStudio会话中,只需键入library(gsubfn)就可以加载所需的proto包,这会导致XQuartz打开(如果我一直打开它,它会很好),所以proto包会导致问题。另外,
第二个块中的is.character(v)
应该是
is.character(y)
,是的!错过了,对不起:)
---
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`)
```