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

时间:2013-12-24 10:42:56

标签: r latex markdown knitr pandoc

我在Markdown中有一个文档,它通过Knitr合并了R代码。对于渲染方程式,我使用LaTeX,只需在文本中编写命令即可。假设我有以下LaTeX代码:

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

当我将所有内容转换为PDF时,它会呈现一个很好的数学矩阵表示(方括号)(完整的工作流程是:RMD - > knitr - > MD - > pandoc - > TeX - > pandoc - > PDF)。

现在,假设我们希望从R对象(即R矩阵x)即时生成所述矩阵。在this post中,我们建立了如何生成所需的LaTeX代码(在那里定义了matrix2latex()函数)。现在的问题是如何让Knitr来评估它。我尝试了以下代码:

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

但它只是产生R输出所在的空格(实际为NULL)。我很惊讶这已经没有被问过了(至少我自己的搜索没有产生任何结果)。任何想法如何使这项工作?

编辑:

如建议的那样,重写不带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)
}

1 个答案:

答案 0 :(得分:10)

这是因为您的matrix2latex函数使用cat并将其输出发送到标准输出流,而不是knitr尝试输出的位置。

两个解决方案:一个是重写函数,使用pastesprintf或其他字符串格式化函数将输出构造为字符串,或者将其作为快速破解包装在{{1}中因此:

capture.output

然后在您的m2l = function(matr){capture.output(matrix2latex(matr))} 文件中:

.Rmd

变为

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

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