knitr: лучшая воспроизводимость вязаного кода - PullRequest
0 голосов
/ 30 января 2020

Рассмотрим файл 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, вы можете забыть установить некоторые вязальные переменные и получить неправильные результаты.

Есть ли способ разрешить только явное задание переменные во время вязания?

...