求助:为嵌套列表中的flextable添加标题的方法
解决flextable添加标题时的"invalid 'rle' structure"错误
问题重现
以下是嵌套列表形式的flextable集合示例代码:
library(data.table) library(flextable) datA <- fread("anyvar somevar 2 4 2 3 2 5") dat_list <- list("one" = list("datA" = datA, "datB" = 2*datA),"two" = list("datC" = 3*datA, "datD" = 4*datA), "three" = list("datE" = 5*datA, "datF" = 6*datA)) for (i in seq_along(dat_list) ) { for (j in seq_along( dat_list[[i]] ) ) { dat_list[[i]][[j]] <- flextable( dat_list[[i]][[j]] ) } } vector_of_lists <- c("one", "two", "three")
尝试为每个flextable添加标题时使用如下代码:
for (i in seq_along(dat_list) ) { for (j in seq_along( dat_list[[i]] ) ) { dat_list[[i]][[j]] <- add_header_row(dat_list[[i]][[j]], top = TRUE, values = paste0("Table: ", i, " Header of table", vector_of_lists[i] )) } }
出现错误:
Error in inverse.rle(structure(list(lengths = colwidths, values = values), :
invalid 'rle' structure
错误原因
add_header_row函数要求values的长度与colwidths的长度匹配。默认情况下colwidths会被设为全1的向量,长度等于表格列数(此处为2),但传入的values是单个字符串,长度不匹配导致rle结构无效。
解决方案
要添加跨列的标题,需指定colwidths为表格的列数,让标题单元格横跨所有列,同时修正标题的拼接格式以符合需求:
for (i in seq_along(dat_list) ) { for (j in seq_along( dat_list[[i]] ) ) { # 获取当前表格的列数 col_num <- ncol(dat_list[[i]][[j]]$body$dataset) # 生成符合格式的标题 table_title <- paste0("Table ", i, ": Header of table ", vector_of_lists[i]) # 添加跨列标题 dat_list[[i]][[j]] <- add_header_row( x = dat_list[[i]][[j]], top = TRUE, values = table_title, colwidths = col_num ) } }
验证
运行修正后的代码后,每个flextable都会添加格式为Table 1: Header of table one、Table 2: Header of table two等的跨列标题,且不会再出现错误。
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

