使用不同的参数包括两次相同的块

时间:2016-07-08 11:01:13

标签: r parameters latex knitr code-reuse

我有一个很长的.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}

2 个答案:

答案 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}