Я обнаружил, что документ 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(), или я использую его неправильно? И есть ли другой способ гарантировать новую среду в документе, вязаном?