Knitr - 使用 Sexpr 定义调用 R 函数的 Latex 命令

Knitr - Define Latex commands that call R functions using Sexpr

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

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

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

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

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

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

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

美好的一天,

不,你不能那样做。问题是 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(),但这似乎工作太多了。