在this answer中,@Yihui说knitr
使用全球环境。这让我很困惑 - 我的经验是它没有。我从来没有真正使用knit
,我通常直接使用PDF。
在一个小实验中,似乎knit
确实使用了全局环境(或使用envir
参数指定的任何环境),但knit2pdf
没有。
最小示例:global_test.Rnw文件
\documentclass{article}
\begin{document}
<<>>=
print(x)
@
\end{document}
R脚本:
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's answer一样?
在我的用例中,我不认为tools::texi2pdf
是有用的,因为我需要使用XeLaTeX进行编译,knit2pdf
可以毫不费力地处理。
答案 0 :(得分:7)
问题中的示例问题似乎与环境无关。如果output
参数不在knit2pdf
之内,那么所有内容都会正确编译而不会发出警告。
作为参考,我在Windows 7上的R 2.15.3上使用了knitr 1.1。我会让Yihui知道它似乎是knit2pdf
中的一个错误(调用tools::texi2pdf
,它不会不接受输出文件路径。
更新:问题已在knitr
,available here的开发版本中修复。
还值得注意的是, RStudio 中的Compile PDF
按钮不会使用您当前的环境,因此如果您想要访问全局变量,那么正在使用RStudio,显式调用相应的knit
函数,而不是依赖于快捷方式。实际上,它不直接使用knit2pdf
,而是调用rmarkdown::render
。