将 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。
我正在使用 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。