在数学或方程环境中将R矩阵转换为LaTeX矩阵

时间:2013-12-23 18:48:41

标签: r latex knitr

假设有一个R矩阵x

x <- structure(c(2, 3, 5, 7, 9, 12, 17, 10, 18, 13), .Dim = c(5L,2L), .Dimnames = list(NULL, c("X1", "X2")))

我正在使用Markdown-pandoc-LaTeX工作流程编写一份包含LaTeX方程的报告。 x是需要出现在这些方程式中的矩阵之一。是否有可能以编程方式呈现矩阵的LaTeX表示如下?:

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

理想情况下,报告代码可以是以下内容:

\begin{displaymath}
\mathbf{X} = `r whatever-R-code-to-render-X`
\end{displaymath}

但这可能很麻烦,所以我肯定会接受简单的转换。

3 个答案:

答案 0 :(得分:10)

您可以使用xtable包print.xtable方法和一个简单的包装器脚本来设置一些默认参数。

bmatrix = function(x, digits=NULL, ...) {
  library(xtable)
  default_args = list(include.colnames=FALSE, only.contents=TRUE,
                      include.rownames=FALSE, hline.after=NULL, comment=FALSE,
                      print.results=FALSE)
  passed_args = list(...)
  calling_args = c(list(x=xtable(x, digits=digits)),
                   c(passed_args,
                     default_args[setdiff(names(default_args), names(passed_args))]))
  cat("\\begin{bmatrix}\n",
      do.call(print.xtable, calling_args),
      "\\end{bmatrix}\n")
}

似乎要做你想要的事

x <- structure(c(2, 3, 5, 7, 9, 12, 17, 10, 18, 13), .Dim = c(5L,2L), .Dimnames = list(NULL, c("X1", "X2")))

bmatrix(x)
## \begin{bmatrix}
##   2.00 & 12.00 \\ 
##   3.00 & 17.00 \\ 
##   5.00 & 10.00 \\ 
##   7.00 & 18.00 \\ 
##   9.00 & 13.00 \\ 
##    \end{bmatrix}

并且不像你的例子那样使用小数位。

bmatrix(x, digits=0)
## \begin{bmatrix}
##   2 & 12 \\ 
##   3 & 17 \\ 
##   5 & 10 \\ 
##   7 & 18 \\ 
##   9 & 13 \\ 
##    \end{bmatrix}

答案 1 :(得分:6)

以后参考,这是我后来写的功能:

matrix2latex <- function(matr) {

printmrow <- function(x) {

    cat(cat(x,sep=" & "),"\\\\ \n")
}

cat("\\begin{bmatrix}","\n")
body <- apply(matr,1,printmrow)
cat("\\end{bmatrix}")
}

它不需要外部包装。由于某种原因,apply在输出结尾处产生了NULL(实际返回?)。这是通过将返回值分配给body变量来解决的,否则该变量没有用。下一个任务是编织内的render the output of that function in LaTeX

答案 2 :(得分:1)

如果有人需要通过 \bordermatrix 使用带有边框的舍入矩阵,我会为此添加@ Maxim.K&#39功能。

m2l <- function(matr) {
    matr <- round(x = matr, digits = 2)  # sadly this is necessary because given this function, the options(digits = 2) does not work
    matr2 <- data.frame(c("~",rownames(matr)))  # add rownames
    for (r in colnames(matr)) {  # add col contents and colnames
      matr2 <- cbind(matr2, c(r, matr[,r]))
    }
    printmrow <- function(x) {
        ret <- paste(paste(x, collapse = " & "), "\\cr")
        sprintf(ret)
    }
    out <- apply(matr2, 1, printmrow)
    out2 <- paste("\\bordermatrix{", paste(out, collapse = ' '),"}")
    return(out2)
}

相当可怕的代码,我知道,但完成了工作。

也许这对那里的人有用。

看起来不错,特别是对于相关矩阵和这样的东西:

tex