首页 > 解决方案 > Knitr - 使用 Sexpr 定义调用 R 函数的 Latex 命令

问题描述

我基本上想知道如何定义一个新的 Latex 命令,以便它允许 Sexpr 和其他一些 R 函数的嵌套,其中 Latex 参数是一个 R 对象。

幸运的是,这个想法在某种程度上是通过下面给出的新命令结构传递的:

 \newcommand{\SomeLatexCommand}[1]{\Sexpr{"#1"}}

幸运的是,确实显示了参数,尽管是字符串。考虑到这一点,我希望使用以下命令:

\newcommand{\SweetLatexCommand}[1]{\Sexpr{SomeRFunction(get("#1"))}}

但是,一旦嵌套在 R 函数中,#1就不会被读取为 Latex 参数的占位符,而是作为现有的 R 变量读取。

有没有办法让最后一个命令起作用?或者,是否还有其他巧妙的方法来定义 Latex 命令,而这些命令又可以通过 R 对象调用任何 R 函数?

再会,

标签: rfunctioncommandlatexknitr

解决方案


不,你不能那样做。问题是工作方式knitr

R 运行knit()函数(或其他knitr函数)。该函数在源代码中查找代码块和\Sexpr调用,执行它们,并用请求的输出替换它们,生成一个.tex文件。

然后 LaTeX 处理该.tex文件。R 不再参与。

由于\newcommand是一个 LaTeX 命令,它只在最后阶段处理,在所有 R 评估完成之后。

可能有一种方法knitr可以指定另一个以这种方式\Sexpr工作的“宏”,但我认为没有办法拥有其中的几个。

所以你应该做的是在 R 中编写多个函数,然后调用它们来做你想做的事情,如\Sexpr{fn1(...)},\Sexpr{fn2(...)}等。

我想如果你真的下定决心,你可以在开始时添加一个额外的预处理器阶段,它会遍历你的Rnw文件并替换所有看起来像然后调用的字符串\SweetLatexCommand{blah}\Sexpr{SomeRFunction(get("blah"))}但这knit()似乎太多工作了。


推荐阅读