使用knitr时,我可以在子Rnw文档之间交换数据吗?

时间:2016-01-03 08:33:46

标签: r knitr

父文件如下:

<<child = "child1.Rnw">>=
@
<<child = "child2.Rnw">>=
@

孩子1:

<<>>=
set_parent("parent.Rnw")
x <- 1
@

孩子2:

<<>>=
set_parent("parent.Rnw")
x
@

我可以运行父文档。但是,我不能单独运行子2文档。似乎子2文档无法看到在子1文档中定义的变量x。如何单独运行子2文档?

1 个答案:

答案 0 :(得分:4)

set_parent并不像您期望的那样工作。来自?set_parent

  

此函数提取父文档的LaTeX前导码以用于子文档,以便可以将子文档编译为单个文档。

set_parent("parent.Rnw")赢得knit整个父文档,它只提取序言。因此,使用此parent.Rnw文件

\documentclass{article}
\begin{document}

<<child = "child1.Rnw">>=
@

<<child = "child2.Rnw">>=
@

\end{document}

child2.Rnw无法单独编译,因为在这种情况下未运行child1.Rnw

以下 1

的作用是什么
knit("parent.Rnw")
knit("child2.Rnw")

由于两个文档都在同一环境中进行评估(请参阅knit的默认envir值),因此来自parent.Rnw(以及它的孩子)的对象可以用于child2.Rnw的后续编织。

此外,?set_parent提供了另一种选择:

  

当父文档的前导码还包含代码块和内联R代码时,它们将被评估为好像它们在此子文档中一样。

如果可以重新排列parent.Rnw,以便引用child1.Rnw的块在序言中

\documentclass{article}

<<child = "child1.Rnw">>=
@

\begin{document}

<<child = "child2.Rnw">>=
@

\end{document}

然后可以编织child2.Rnw而无需事先编织parent.Rnw

1 出于某种原因,knit2pdf("child2.Rnw")在我的系统上崩溃pdflatex.exe(通过texify.exe调用)。但是,PDF文件已正确生成,并且直接在TEX文件上运行pdflatex不会造成任何麻烦。 Nevermind。功能