【问题标题】:knitr with latex forloop带有乳胶forloop的knitr
【发布时间】:2012-07-03 19:41:28
【问题描述】:

对不起,如果这是一个愚蠢的问题,但有人知道如何在 knitr 中循环 R 函数吗?到目前为止,我的问题是将变量从乳胶传递到 R 函数。我正在尝试做这样的事情:

\documentclass{article}
\usepackage{forloop}
\newcounter{ind}  
\begin{document}

%Simple R function:
<<simpleRFun, results='asis' ,echo=FALSE>>=
simpleRFun = function(ind){
  set.seed(ind) ;
  plot(runif(100)) ;
}
@

%Run the function for value of 1
<<>>=
simpleRFun(1)
@

%Run the function for value of 2
<<>>=
simpleRFun(2)
@

%Loop over values of 1 and 2:
\forloop{ind}{1}{\value{ind} < 3}{
   \arabic{ind}
}

%Loop over values of 1 and 2 and pass to R function:
%Everything runs fine until this line:
\forloop{ind}{1}{\value{ind} < 3}{
<<>>=
simpleRFun(ind)
@
}

\end{document}

我收到以下错误:

Runaway argument?
 #### Error: object 'ind' not found \end {verbatim} \end {kframe} \end \ETC.
./knitr-minimal.tex:97: Paragraph ended before \@xverbatim was complete.
<to be read again> 
                   \par 
l.97 }

提前感谢您的帮助。

【问题讨论】:

  • 为什么第一个块使用results='asis'?这是没有意义的,因为该块没有任何文本输出;更何况你还把echo=FALSE隐藏了R源码,所以基本上不会有任何东西写入tex
  • 如果一切都失败了,你可以用brew 做,并输出一个可编织的文件。

标签: r for-loop latex knitr


【解决方案1】:

我不认为你可以做你想做的事(至少不能以你想做的方式)。 knitr 函数运行所有 R 代码而不对 LaTeX 代码做任何事情,然后你在结果上使用 LaTeX,它不会为 R 部分运行 R。

您能否重做循环以在 R 中进行循环,以便 knitr 将循环结果放入 LaTeX 中?

或者你需要一个 LaTeX 的扩展来为你运行 R 部分。

【讨论】:

  • 格雷格,感谢您的反馈。但我很确定它会以这种方式工作,并且如果这样做有好处 - 即我可以在循环的非常级别插入乳胶。代码 %Everything 运行良好,直到这一行: \forloop{ind}{1}{\value{ind} >= simpleRFun(1) @ } 运行 R 代码正常(两次),只是为了相同的变量(此处为 1)。我只需要从循环中获取变量以传递给 R。我认为问题在于我对如何在乳胶中传递环境变量缺乏了解。再次感谢。
  • 您确定 R 会运行该部分两次吗?您的 R 工作区中是否有一个名为 ind 的变量? (如果是这样,请将其删除并重试,您可能会收到错误消息)。我认为上面发生的是knitr 在R 中运行SimpleRfun(ind) 一次,忽略LaTeX for 循环并使用ind 的本地到R 副本,然后LaTeX 获取该输出并包含它两次。 knitr 忽略(并传递)所有 LaTeX 代码(包括循环),只是用它的输出替换 R 代码,然后 LaTeX 处理文件,只输出,没有代码剩余。
  • 啊,我相信你是对的。我刚刚在图表中添加了“ind”(main=ind),正如你所说,它只是将图表复制了两次。相反,你知道有什么方法可以将直接乳胶添加到我的 R 块内的循环中吗?我需要乳胶在循环的每个间隔更新。谢谢。
  • 我不太明白你在这里真正想做什么;如果你想在一个循环中生成两个图,为什么不for (i in 1:2) simpleRFun(i)?如果你想从 R 块编写原生 TeX 输出,你可以使用块选项 results='asis' 结合 R 代码中的一些 cat() 语句。
  • @JimCrozier paste 函数只是将字符串组合在一起但不打印它们(但如果您不分配结果,则在结果上调用 print)。 print 函数用于“漂亮打印”或格式化输出,有时只显示正在“打印”的对象的子集,并且可以添加附加信息。 cat 函数将其参数粘贴在一起,然后将它们原样转储到屏幕或文件中(名称 cat 来自对最初是 concatenate 的缩写的 unix cat 命令的常见误用)。
猜你喜欢
  • 1970-01-01
  • 2020-01-28
  • 2014-01-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多