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

Error in applying a for loop to an xtable in knitr

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

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)
}

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

该函数似乎产生了预期的结果,但是当我编译文档时,print.xtable 中的 'include.rownames = FALSE' 参数似乎不起作用,并且我在 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)

下面是我打印 table 的方式:

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

你很接近。问题出在您的 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
  )

这应该能满足您的需求:

完全可复制的 .Rnw 文件可用 here