我發現knitr文檔會繼承用戶環境中的變量,即使提供了參數envir = new.env()
也是如此。我怎樣才能防止它繼承這些變量?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()
:
其中的代碼塊是編織過程中進行評估(可使用new.env環境()來保證一個空的新環境)。
但是,出於同樣的原因,render
顯示與上述相同的行爲。我的期望(和rmarkdown文檔)是否對於envir = new.env()
錯誤,或者我使用不正確?還有另外一種方法可以保證正在編織文件的新環境?
如果我使用'baseenv'你可以使用baseenv代替 – rawr
@rawr,我無法在knitr塊中加載任何軟件包。例如,嘗試將上面的行更改爲'writeLines(c(「'''{r}」,「library(ggplot2)」,「qplot(rnorm(100))」),「test.Rmd」); knit(「test.Rmd」,quiet = TRUE,envir = baseenv())' –