Knit:Markdown 文档中 LaTeX 环境中的 R 代码

2024-02-15

我有一个 Markdown 文档,其中包含 R 代码Knitr。对于渲染方程,我使用 LaTeX,只需在文本中编写其命令即可。假设我有以下 LaTeX 代码:

\begin{displaymath}
\mathbf{X} = \begin{bmatrix}
2 & 12\\ 
3 & 17\\ 
5 & 10\\ 
7 & 18\\ 
9 & 13\\
\end{bmatrix}
\end{displaymath}

当我将所有内容转换为 PDF 时,这为我提供了一个很好的数学矩阵表示(在方括号中)(完整的工作流程是:RMD -> knit -> MD -> pandoc -> TeX -> pandoc -> PDF)。

现在,假设我们希望从 R 对象(某个 R 矩阵)即时生成所述矩阵x. In 这个帖子 https://stackoverflow.com/questions/20749444/converting-r-matrix-into-latex-matrix-in-the-math-or-equation-environment/20751549?noredirect=1#20751549我们确定如何生成所需的 LaTeX 代码(matrix2latex()函数在那里定义)。现在的问题是如何得到Knitr来评价它。我尝试了以下代码:

\begin{displaymath}
\mathbf{X} = `r matrix2latex(x)`
\end{displaymath} 

但它只是在 R 输出应该在的地方产生空白(实际上是 NULL)。我很惊讶这个问题还没有被问过(至少我自己的搜索没有得到任何结果)。有什么想法可以让这项工作发挥作用吗?

EDIT:

按照建议,重写该函数而无需cat()。这是该函数的工作版本以供将来参考:

m2l <- function(matr) {

    printmrow <- function(x) {

        ret <- paste(paste(x,collapse = " & "),"\\\\")
        sprintf(ret)
    }

    out <- apply(matr,1,printmrow)
    out2 <- paste("\\begin{bmatrix}",paste(out,collapse=' '),"\\end{bmatrix}")
    return(out2)
}

这是因为你的matrix2latex功能用途cat并将其输出发送到标准输出流,这不是knitr正在尝试输出。

两种解决方案:一种是重写函数以使用以下命令将输出构造为字符串paste and sprintf或其他字符串格式化函数,或者作为快速破解,只需将其包装起来capture.output thus:

m2l = function(matr){capture.output(matrix2latex(matr))}

然后在你的.Rmd file:

\begin{displaymath}
\mathbf{X} = `r m2l(x)`
\end{displaymath}

becomes

\mathbf{X} = \begin{bmatrix} , 0.06099 & 0.768 \\ , 0.6112 & 0.004696 \\ , 0.02729 & 0.6198 \\ , 0.8498 & 0.3308 \\ , 0.6869 & 0.103 \\ , \end{bmatrix}

虽然不是很完美,但确实说明了原理。内联表达式插入的代码是它的值,而不是它打印的内容或猫。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Knit:Markdown 文档中 LaTeX 环境中的 R 代码 的相关文章

随机推荐