13

这个答案中,@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@Ramnath对上述相同问题sprintf的回答?

在我的用例中,我认为没有tools::texi2pdf用,因为我需要使用 XeLaTeX 进行编译,它可以knit2pdf轻松处理。

4

1 回答 1

8

问题中示例的问题似乎与环境无关。output如果参数被忽略,一切都将正确编译并且没有警告knit2pdf

作为参考,我在 Windows 7 上的 R 2.15.3 上使用了 knitr 1.1。我会让 Yihui 知道,因为它似乎是一个错误knit2pdf(它调用tools::texi2pdf,它不接受输出文件路径)。

更新:该问题已在 的开发版本中得到修复knitr可在此处获得

还值得注意的是,RStudioCompile PDF中的按钮使用您当前的环境,因此如果您想访问全局变量并且您正在使用 RStudio,请显式调用适当的函数,而不是依赖快捷方式。事实上,它并不直接使用,而是调用. knitknit2pdfrmarkdown::render

于 2013-03-26T21:56:05.960 回答