【问题标题】:Knitr - Define Latex commands that call R functions using SexprKnitr - 使用 Sexpr 定义调用 R 函数的 Latex 命令
【发布时间】:2021-11-11 21:38:01
【问题描述】:

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

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

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

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

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

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

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

早安,

【问题讨论】:

    标签: r function command latex knitr


    【解决方案1】:

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

    【讨论】:

    • 很高兴知道 Sexpr 的表现如何。不过,我想知道为什么定义像 \newcommand{\SomeLatexCommand}[1]{\Sexpr{"#1"}} 这样的函数确实有效。不是每次写 \SomeLatexCommand{Some text} 时总是打印 #1,而是在 pdf 文件上,我们确实将输入作为“Some text”中的字符串获取。如果 \Sexpr 应该替换 tex 文件中的“#1”输出,这怎么会发生?啊,我猜是因为放回 #1 会使 newcommand 定义完全符合预期。我错了吗?
    • 作为旁注,是的,我喜欢使用固定 R 函数输出的固定乳胶函数列表的想法。我认为这值得另一个线程,但是您是否认为它可以修复诸如\Sexpr 之类的解决方案,仅当\Sexpr 被发现 \begin{document}\begin{document} 之后才调用R 函数?
    猜你喜欢
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-06
    • 1970-01-01
    • 1970-01-01
    • 2016-10-28
    • 2019-04-14
    相关资源
    最近更新 更多