Max*_*m.K 9 markdown latex r pandoc knitr
我在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}
Run Code Online (Sandbox Code Playgroud)
当我将所有内容转换为PDF(然后完整的工作流程为:RMD - > knitr - > MD - > pandoc - > TeX - > pandoc - > PDF)时,这给我一个很好的数学矩阵表示(方括号).
现在,假设我们希望从R对象(一些R矩阵)即时生成所述矩阵x.在这篇文章中,我们建立了如何生成所需的LaTeX代码(该matrix2latex()函数在那里定义).现在的问题是如何Knitr评估它.我尝试了以下代码:
\begin{displaymath}
\mathbf{X} = `r matrix2latex(x)`
\end{displaymath}
Run Code Online (Sandbox Code Playgroud)
但它只是产生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)
}
Run Code Online (Sandbox Code Playgroud)
Spa*_*man 10
这是因为您的matrix2latex函数使用cat并将其输出发送到标准输出流,而不是knitr尝试放置输出的位置.
两个解决方案:一个是重写您的函数以使用paste和/ sprintf或其他字符串格式化函数将输出构造为字符串,或者作为快速黑客将其包装在其中capture.output:
m2l = function(matr){capture.output(matrix2latex(matr))}
Run Code Online (Sandbox Code Playgroud)
然后在你的.Rmd文件中:
\begin{displaymath}
\mathbf{X} = `r m2l(x)`
\end{displaymath}
Run Code Online (Sandbox Code Playgroud)
变
\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}
Run Code Online (Sandbox Code Playgroud)
虽然不是很完美,但这说明了原理.内联表达式插入的代码是它的值,而不是它打印的内容或猫.
| 归档时间: |
|
| 查看次数: |
2204 次 |
| 最近记录: |