将for循环应用于knitr中的xtable时出错

时间:2015-05-18 17:21:33

标签: r latex knitr xtable

我正在使用包含使用xtable生成的表的knitr准备pdf。我在表格的某些单元格中添加了粗体字,所以我写了以下函数:

bold <- function(x, matrix){
        x[] <- lapply(x, as.character)
          for (i in 1:ncol(x)) {   
            yes <- matrix[,i]
              x[yes,i] <- paste('\\textbf{', x[yes,i], '}', sep = "")  
          } 
                print(x, sanitize.text.function = identity)
}

我的意图是对象&#39; l.mat&#39;是一个逻辑矩阵,通过改变矩阵中的1和0,我可以改变哪些单元格是粗体。

该函数似乎产生了预期的结果,但是当我编译文档时,&#39; include.rownames = FALSE&#39; print.xtable中的参数似乎不起作用,我在pdf中打印出以下错误:

TRUE Error in rep(" ", nrow(x) + 2): invalid ’times’ argument  

以下是我如何创建用于逻辑测试的矩阵:

l.vec <- as.logical(c(1,1,1,1,1,
                      1,1,1,1,1,
                      0,0,0,0,0,
                      0,0,0,0,0,
                      0,0,0,0,0,
                      0,0,0,0,1))

l.mat <- matrix(l.vec, nrow = 6, ncol = 5, byrow = TRUE)

以下是我打印桌子的方式:

x.df.2 <- (xtable(df.2))

x.df.3 <- bold(x.df.2, l.mat)

print.xtable(x.df.3, include.rownames = FALSE)

我已经远远超出了我的深度,我无法解决这个问题。我觉得我不太了解xtable,latex和knitr是如何工作和交互来理解这个错误的。任何有关导致这些错误的指导都会非常有帮助。

示例数据框:

df.2 <-     DATE   CY   FY Quarter  XEMPNIN
        275 2043:3 2043 2044       3 3324.391
        276 2043:4 2043 2044       4 3326.214
        277 2044:1 2044 2044       1 3328.492
        278 2044:2 2044 2044       2 3330.100
        279 2044:3 2044 2045       3 3331.963
        280 2044:4 2044 2045       4 3334.248

1 个答案:

答案 0 :(得分:1)

你很亲密。问题在于您的bold()功能。尝试:

bold <- function(x, matrix) {

  x[] <- lapply(x, as.character)

  for (i in 1:ncol(x)) {   
    yes <- matrix[,i]
    x[yes,i] <- paste('\\textbf{', x[yes,i], '}', sep = "")  
  } 
  return(x)
}

并将sanitize.text添加到print.xtable()来电:

print.xtable(
  x.df.3, 
  include.rownames = FALSE, 
  sanitize.text.function = identity
  )

这可以给你你想要的东西:

xtable_output

可以使用完全可重现的.Rnw文件here