我发现knitr文档继承了用户环境中的变量,即使envir = new.env()提供了参数.如何防止它继承这些变量?
例如,假设我使用不存在的变量(y)编写了一个简单的.Rmd文件,编织它并显示生成的文件:
library(knitr)
writeLines(c("```{r}", "y + 1", "```"), "test.Rmd")
knit("test.Rmd", quiet = TRUE, envir = new.env())
# [1] "test.md"
cat(readLines("test.md"), sep = "\n")
#
# ```r
# y + 1
# #> Error in eval(expr, envir, enclos): object 'y' not found
# ```
Run Code Online (Sandbox Code Playgroud)
当然,我得到一个错误,即y变量不存在,就像我应该的那样.
但是,如果我y在我自己的环境中定义,我发现我现在可以y在.Rmd文件中引用,即使我给出了envir = new.env()参数.
y <- 3
knit("test.Rmd", quiet = TRUE, envir = new.env())
# [1] "test.md"
cat(readLines("test.md"), sep = "\n")
#
# …Run Code Online (Sandbox Code Playgroud) 给定子文档列表,您如何根据某些条件选择插入主文档?
在我的用例中,我将一个数据集中的未知条目与第二个数据集中的所需条目进行匹配.第二个数据集具有与每个条目相关联的子文档.如果找到匹配项,我想要包含其关联的子文档.
在其最基本的形式,这个伪代码显示了什么,我想实现(被这个问题启发要点这里):
```{r, eval=TRUE}
child_docs <- setNames(c(TRUE, FALSE, TRUE, FALSE),
c("doc1.Rmd", "doc2.Rmd","doc3.Rmd","doc4.Rmd"))
for(i in seq_along(child_docs)){
file <- names(child_docs)[i]
eval_status <- child_docs[i]
```{r child = file, eval = eval_status}
```
}
```
Run Code Online (Sandbox Code Playgroud)
或者,更简单:
```{r}
child_docs <- c("child/doc1.Rmd", "child/doc2.Rmd","child/doc3.Rmd","child/doc4.Rmd")
```
```{r child = child_docs}
```
Run Code Online (Sandbox Code Playgroud)
我也试过这些,但它们没有用(RMarkdown代码块):
```{r}
child_docs <- c("child/doc1.Rmd", "child/doc2.Rmd","child/doc3.Rmd","child/doc4.Rmd")
for(i in seq_along(child_docs)){
doc <- child_docs[i]
knit_child(doc)
}
```
Run Code Online (Sandbox Code Playgroud)
(直接在RMarkdown文档中):
`for(i in seq_along(child_doc)){ doc <- child_doc[i]; knit_child(doc)}`
Run Code Online (Sandbox Code Playgroud)
作为参考,这里的手册(在LaTeX中)就在这里.