我正在使用R中的可弯曲函数来创建一个漂亮的平面应急表。我的平面应急表有两行列标题。我试图使用可弯曲包中的set_header_labels-function来更改这些内容,但是失败了。
下面的步骤代表了我所经历的过程。前五步进展顺利。在最后一步中,我没有达到我想要的结果,我想要将列标题名从"A“更改为"aa”,从"B“更改为"bb”。请注意,在一开始将"A“改为"aa”等并不能解决我的问题。我真的需要做我想要的改变,在最后,而不是在开始!
t <- tibble(ID = 1:10,
header1 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
header2 = c("No", "No", "No", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "No"),
q1 = c(1, 3, 2, 2, 3, 1, 2, 1, 1, 3))ft <- (t %>% ftable(row.vars = c("q1"), col.vars = c("header1", "header2")))
ftable_to_flextable <- function( x ){
row.vars = attr( x, "row.vars" )
col.vars = attr( x, "col.vars" )
rows <- rev(expand.grid( rev(row.vars), stringsAsFactors = FALSE ))
cols <- rev(expand.grid( rev(col.vars), stringsAsFactors = FALSE ))
xmat <- as.matrix(x)
cols$col_keys = dimnames(xmat)[[2]]
xdata <- cbind(
data.frame(rows, stringsAsFactors = FALSE),
data.frame(xmat, stringsAsFactors = FALSE)
)
names(xdata) <- c(names(row.vars), cols$col_keys)
ft <- regulartable(xdata)
ft <- set_header_df(ft, cols)
ft <- theme_booktabs(ft)
ft <- merge_v(ft, j = names(row.vars))
ft
}flext <- ftable_to_flextable(ft)
flext <- merge_at(flext, i = 1, j = 2:3, part = "header")
flext <- merge_at(flext, i = 1, j = 4:5, part = "header")运行flext现在返回:

set_header_labels(flext, A = "aa", B = "bb")
我收到以下错误消息:
Error in `[<-`(`*tmp*`, i, j, value = value) : subscript out of bounds发布于 2019-12-16 21:04:56
这将完成您的代码的工作。
# flext <- flextable::compose(flext, i = 1, j = 2, part = "header", value = as_paragraph("aa"))
# flext <- flextable::compose(flext, i = 1, j = 4, part = "header", value = as_paragraph("bb"))如果这有帮助,我将使用泛型as_flextable来实现它。
library(flextable)
dat <- data.frame(
ID = 1:10,
header1 = c("A", "A", "A", "A", "A", "B", "B", "B", "B", "B"),
header2 = c("No", "No", "No", "Yes", "Yes", "Yes", "Yes", "No", "Yes", "No"),
q1 = c(1, 3, 2, 2, 3, 1, 2, 1, 1, 3),
stringsAsFactors = FALSE
)
dat$header1 <- factor(dat$header1, levels = c("A", "B"), labels = c("aa", "bb"))
dat$header2 <- factor(dat$header2, levels = c("No", "Yes"), labels = c("nope", "ok"))
ft <- ftable(dat,
row.vars = c("q1"),
col.vars = c("header1", "header2")
)
as_flextable.ftable <- function(x, ...) {
row.vars <- attr(x, "row.vars")
col.vars <- attr(x, "col.vars")
rows <- rev(expand.grid(rev(row.vars), stringsAsFactors = FALSE))
cols <- rev(expand.grid(rev(col.vars), stringsAsFactors = FALSE))
xmat <- as.matrix(x)
cols$col_keys <- dimnames(xmat)[[2]]
xdata <- cbind(
data.frame(rows, stringsAsFactors = FALSE),
data.frame(xmat, stringsAsFactors = FALSE)
)
names(xdata) <- c(names(row.vars), cols$col_keys)
ft <- flextable(xdata)
ft <- set_header_df(ft, cols)
ft <- theme_booktabs(ft)
ft <- merge_h(ft, i = seq_len(ncol(rows)), part = "header")
ft
}
as_flextable(ft)

这可能需要额外的工作,但没有那么多。
https://stackoverflow.com/questions/59357908
复制相似问题