gpt4 book ai didi

r - knitr 从用户的环境中继承变量,即使是 envir = new.env()

转载 作者:行者123 更新时间:2023-12-03 23:50:50 27 4
gpt4 key购买 nike

我发现 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
# ```

当然,我得到一个错误 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")
#
# ```r
# y + 1
# # [1] 4
# ```

我的理解是 envir = new.env()应该导致在没有 y 的新环境中评估 knitr 文档多变的。这是一个问题,因为它允许 knitr 文档不可复制,指的是我没有在文档中定义的变量。

注意 rmarkdown render documentation (这是 knit 的包装)特别说你可以使用 envir = new.env() :

The environment in which the code chunks are to be evaluated during knitting (can use new.env() to guarantee an empty new environment).



然而, render出于相同的原因,显示与上述相同的行为。我对 envir = new.env() 的期望(和 rmarkdown 文档)是否不正确? ,还是我使用不当?还有另一种方法可以保证正在编织的文档中的新环境吗?

最佳答案

new.env has a parent argument其默认值为 parent.frame() — 即调用者。换句话说,您的新环境继承了您当前环境的所有内容。
您可以通过指定 parent 来避免这种情况。 :

new.env(parent = baseenv())
或者,如果您想继承加载的包:
new.env(parent = as.environment(2))
而且,是的, render文档有点误导:而 new.env()提供了一个新的、空的环境,它并没有完全与调用者解耦,而且调用者可能几乎不想只使用 new.env() .
为了能够在从 baseenv() 继承的干净环境中使用包,你需要手动实现包附件机制,因为R包本身不支持环境隔离(grrr!)。或者您使用 ‘box’ package ,它支持本地附加包:
```{r}
box::use(ggplot2[...])
qplot(rnorm(10))
```
[...]声明导致包被附加到本地(在当前范围内),与 library 不同.

关于r - knitr 从用户的环境中继承变量,即使是 envir = new.env(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32257970/

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