Я обнаружил, что документ knitr наследует переменные из пользовательской среды, даже если предоставлен аргумент envir = new.env()
. Как я могу предотвратить наследование этих переменных?
Например, предположим, что я написал простой файл .Rmd, используя переменную, которая не существует (y
), связала ее и показала результирующий файл:
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()
должен был обработать документ knitr в новой среде без переменной y
. Это проблема, потому что она позволяет документам knitr быть невоспроизводимыми, ссылаясь на переменные, которые я не определяю в документе.
Обратите внимание, что rmarkdown render
документация (которая является оберткой вокруг knit
), в частности говорит, что вы можете использовать envir = new.env()
:
Среда, в которой фрагменты кода должны оцениваться во время вязания (можно использовать new.env(), чтобы гарантировать пустую новую среду).
Однако, по этой же причине render
показывает то же поведение, что и выше. Неужели мои ожидания (и rmarkdown docs) неправильны в отношении envir = new.env()
, или я использую его неправильно? И есть ли другой способ гарантировать новую среду в документе, вязаном?