【问题标题】:Can knit2pdf use the global environment?knit2pdf可以使用全局环境吗?
【发布时间】:2013-03-26 20:59:10
【问题描述】:

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 来做到这一点,或者明确地传递一个环境,或者我最好使用brewsprintf 作为在@Ramnath's answer 上面的同一个问题?

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

【问题讨论】:

  • 您是否尝试过在knit2pdf 中显式设置envir 参数?
  • 是的,我只是得到一个未使用的参数错误。
  • 你试过不引用全局变量吗?当我尝试使用 knit2pdf() 时,我得到完全相同的错误,当 R 代码的一行是 print("Hello World") 时(即当没有明确引用全局变量时)......我在 Windows XP 机器上,使用 R-devel 和 knitr_1.1,在引擎盖下使用 MikTeX 发行版。
  • @JoshO'Brien,感谢您指出这一点! knit2pdfoutput 参数似乎有问题,当它消失时,其他一切都按预期工作。

标签: r knitr


【解决方案1】:

问题中示例的问题似乎与环境无关。如果output 参数从knit2pdf 中省略,一切都将正确编译且不会出现警告。

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

更新:该问题已在knitravailable here的开发版中修复。

另外值得注意的是,RStudio中的Compile PDF按钮使用你当前的环境,所以如果你想访问全局变量并且你正在使用RStudio,对适当的knit 函数进行显式调用,而不是依赖快捷方式。其实它并没有直接使用knit2pdf,而是调用rmarkdown::render

【讨论】:

  • 感谢您报告问题!真正的故事是,knitr 1.1 没有 envir 参数; knitr 的开发版本添加了它,但后来删除了 output 参数。现在最新的开发版本有这两个参数,knit2pdf() 现在应该可以正常工作了。
  • 我正在使用带有 R markdown 的 Rstudio。这是否也适用于降价文档?我正在使用 source() 在缓存块中运行脚本。我想在以后的块中使用该脚本中计算的对象,但这些对象似乎不适用于以后的块。你能澄清一下我需要做什么吗?
  • @statistician_in_training 在一个块中定义的对象绝对应该在以后的块中可用,无论您如何编译。如果您对此有疑问,请创建一个最小示例并将其作为问题发布。
  • 我已经创建了一个新的question,其中包含一个最小示例,关于将缓存块与源脚本一起使用并在以后的块中访问 R 对象。
  • @易慧。我在 Windows7 上使用 R_3.0.1、knitr_1.5、Emacs/ESS 尝试了上述代码,但我仍然收到消息“......状态为 1”。当我删除输出部分时,生成了 pdf。
猜你喜欢
  • 1970-01-01
  • 2018-02-08
  • 2019-01-04
  • 2018-10-19
  • 1970-01-01
  • 1970-01-01
  • 2019-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多