Может ли knit2pdf использовать глобальную среду?

В этот ответ, @Yihui сказал, что knitr использует глобальную среду. Это меня смутило - мой опыт состоял в том, что это не так. Я никогда не использую knit, хотя обычно я перехожу прямо в PDF.

В небольшом эксперименте кажется, что knit использует глобальную среду (или любую другую среду, которую вы указываете с помощью аргумента envir), но это knit2pdf не работает.

Минимальный пример: файл global_test.Rnw

\documentclass{article}
\begin{document}
<<>>=
    print(x)
@
\end{document}

R Script:

x <- "Hello World"
knit(input="global_test.Rnw")
# Works as expected, could now call tools::texi2pdf to generate pdf.

knit2pdf(input="global_test.Rnw")
# Doesn't

Последний создает файл PDF, который не будет отображаться, и выдает предупреждение:

running command '"C:\PROGRA~2\MIKTEX~1.9\miktex\bin\texi2dvi.exe" --quiet --pdf
"global.pdf"  -I "C:/PROGRA~1/R/R-215~1.3/share/texmf/tex/latex" -I
"C:/PROGRA~1/R/R-215~1.3/share/texmf/bibtex/bst"' had status 1 

Я попытался передать среду knit2pdf (envir = globalenv()), надеясь, что она будет ... передана, я просто получаю неиспользуемую ошибку аргумента.

Как правило, я знаю, что ссылка на глобальную среду является плохой формой, но есть ли способ сделать это с помощью knit2pdf или передать среду явно, или мне лучше использовать brew и sprintf как в @Ramnath ответить на тот же вопрос выше?

В моем случае использования, я не думаю, что tools::texi2pdf полезен, потому что мне нужно скомпилировать с XeLaTeX, который knit2pdf обрабатывает без усилий.

Ответ 1

Проблемы с примерами в вопросе, похоже, не имеют ничего общего с средами. Все будет компилироваться правильно и без предупреждений, если аргумент output оставлен без knit2pdf.

Для справки, я использовал knitr 1.1 на R 2.15.3 в Windows 7. Я дам Yihui знать, поскольку он кажется ошибкой в ​​ knit2pdf (который вызывает tools::texi2pdf, который не принимает выходного файла).

ОБНОВЛЕНИЕ: Проблема была исправлена ​​в версии разработки knitr, доступной здесь.

Также стоит отметить, что кнопка Compile PDF в RStudio не использует вашу текущую среду, поэтому, если вы хотите иметь доступ к глобальным переменным и используете RStudio, сделайте явный вызов соответствующую функцию knit, а не полагаться на ярлык. Фактически, он не использует knit2pdf напрямую, а вызывает rmarkdown::render.