我有一个很长的.Rnw文档,其中主要包含文本(在LaTeX中排版),其中包含几个块。我还写了一个输出特定数字的块。该图包含一个图,该图的值当前从.csv文件中读取,一些参数如在块中手动定义的颜色。
现在我想在文档中的不同位置使用相同的图形,但是图表的值不同,而其他一些参数不同。理想情况下,我希望将块作为子项包含两次,并以某种方式将参数传递给它,包括用于绘图值的.csv的名称。我不想复制使用硬编码参数粘贴块代码,因为它足够复杂,以至于潜在的更改难以同步。
我该怎样做"参数化重用"大块?
根据要求,一个小例子
保存为include-chunk-reuse.Rnw
<<toReuse, echo=FALSE, result='asis'>>=
l <- 25
@
\newlength{\mylength}
\setlength{\mylength}{\Sexpr{l}pt}
%Omitted: a lot of complicated LaTeX commands
\rule{\mylength}{1pt}
这是应该重用块的文档。它甚至没有编译,因为它抱怨相同的标签被使用了两次:Error in parse_block(g[-1], g[1], params.src) : duplicate label 'toReuse'
\documentclass{article}
\begin{document}
This is some text. And now comes a 25 pt wide line.
<<first-figure, child='include-chunk-reuse.Rnw'>>=
@
This is some text. The next line is also 25 pt wide. But I would like to call the chunk in a way which makes it 50 pt wide instead.
<<second-figure, child='include-chunk-reuse.Rnw'>>=
@
\end{document}
答案 0 :(得分:0)
要使knitr部分工作,只需在子文档中省略chunk-name,然后你就不会有重复的标签,而knitr部分也可以工作。
传递参数并没有真正起作用,但我可以在包含子项之前设置一个全局变量。 (例如\Sexpr{l <- 200}
您仍在重新定义\mylength
,这就是LaTeX会抛出错误的原因,因此将\mylength
的第一个定义从子项移到主文档。
答案 1 :(得分:0)
下面的示例演示了两种重用和参数化块的方法。
解释了这个机制here。基本上,重用块的最简单方法是添加另一个具有相同标签的空块。或者,chunk option ref.label
允许块继承另一个块代码。
两种重用块的方法在很大程度上是等价的 - 有一个例外:以块为单位生成的数字保存为chunklabel-i.pdf
,其中i
是由块计算的数字索引。因此,如果通过重复其标签来重用块,则第二次使用中的图i
将覆盖第一次使用时的图i
。这就是为什么我在下面的例子中使用ref.label
(以及不同的块标签)的原因(否则,两个图上的点都是绿色)。
在下面的示例中,我使用eval = FALSE
来阻止评估定义它的masterchunk
。另一种方法是externalize块,并按read_chunk()
读取。
两个最直接的选择&#34;传递&#34;块的参数是
同样在重用块时,每次使用都可以设置不同的块选项。以下示例利用此功能设置不同的标题。
由于所有块都在相同的环境中运行,因此在早期块中设置变量会影响后续访问此变量的块。在下面的示例中,mycolor
以这种方式进行了修改。
\documentclass{article}
\begin{document}
<<masterchunk, eval = FALSE>>=
plot(1:10, col = mycolor)
@
<<config1>>=
mycolor <- "red"
@
<<use1, ref.label = "masterchunk", fig.cap = "Red dots">>=
@
<<config2>>=
mycolor <- "green"
@
<<use2, ref.label = "masterchunk", fig.cap = "Green dots">>=
@
\end{document}