在knitr中将for循环应用于xtable时出现错误

3

我正在使用knitr准备一个包含使用xtable生成的表格的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)
}

我的意图是让对象“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)

这里是我打印表格的方法:

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个回答

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文件链接


非常感谢!我简直不敢相信我离成功如此之近,我一直以为这是一个复杂的knitr/latex问题。 - Matt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接