Рассмотрим файл foo.Rmd
следующим образом:
```{r foo, echo=yes}
print("Hello")
```
Обратите внимание, что эхо-код кода чанка не является постоянным, а зависит от значения переменной yes
, установленной вне foo.Rmd
.
Можно установить значение переменной вязания, например, yes <- TRUE
, а затем вызвать knit("foo.Rmd")
. Однако это делает код fr agile. Фактически, если вызывающий код устанавливает yes
для своих нужд, это повлияет на вязание. Для больших / сложных Rmd может быть легко иметь конфликты переменных: например, вы забыли установить переменную для вязания, но эта переменная уже определена по какой-то причине, и вы получите непредсказуемые / неправильные результаты.
Гипотетическим решением является явная установка переменных вязания через аргумент knit()
envir
. То есть:
e <- new.env()
e$yes <- TRUE
knit("foo.Rmd", envir=e)
foo.Rmd
теперь оценивается в среде e
, где yes
имеет значение TRUE
.
В случае нескольких определений риск столкновения отсутствует:
e <- new.env()
e$yes <- TRUE
yes <- FALSE
knit("foo.Rmd", envir=e)
Результирующая уценка повторяет чанк, то есть yes <- FALSE
, установленный в родительской среде, явно не влияет на значение установить через e
в оценках фрагментов.
Теперь вы можете ожидать:
e <- new.env()
yes <- FALSE
knit("foo.Rmd", envir=e)
приведет к ошибке, такой как object 'yes' not found
. К сожалению, вязание работает с использованием yes <- FALSE
в родительской.
Это менее проблематично c, но все же, для сложного Rmd, вы можете забыть установить некоторые вязальные переменные и получить неправильные результаты.
Есть ли способ разрешить только явное задание переменные во время вязания?