gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 12:21:27 24 4
gpt4 key购买 nike

我想在 R Markdown 输出中显示参数值而不是 params$...。例如,下面的第一个代码块在输出中显示 params$file,但我想用 samples.txt 替换它。我尝试用 message 添加第二个 block ,但它输出一个白色代码块,我想要像所有其他 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
```

最佳答案

您可以修改源代码 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)
```

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

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

enter image description here

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


更新:更通用的方法

我对您的示例进行了一些尝试并创建了一个更通用的钩子(Hook)。它应该替换代码块中 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 中是不可能的)。此函数采用找到的元素,但是,由于正则表达式,只有 $ 之后的部分。所以在这个 block 中,y 等于 fileageawesome

enter image description here

关于用源代码块中的相应值替换变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43699235/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com