R语言迭代生成flextable时批量匹配对应表格标题问题
问题原因
你在嵌套调用map时没有传入对应标题的索引,所有表格都传入了完整的titles_tables向量,set_caption仅接收单个字符串作为标题,默认会取向量第一个元素,因此所有表格标题都相同。另外你定义标题向量时变量名为.title,后续拼接标题时写为title,存在变量名不一致的问题,也会导致标题生成异常。
解决代码
首先修正标题生成部分的变量名问题:
.title <- c( "FeatureA(100-150).Loc1", "FeatureA(100-150).Loc2", "FeatureA(100-150).Loc3", "FeatureB(200-400).Loc1", "FeatureB(200-400).Loc2", "FeatureB(200-400).Loc3", "FeatureC(200-800).Loc1", "FeatureC(200-800).Loc2", "FeatureC(200-800).Loc3", "FeatureD(800-1200).Loc1", "FeatureD(800-1200).Loc2", "FeatureD(800-1200).Loc3", "FeatureD(800-1200).Loc4" ) list_1 <- paste0('lsmeans statics of ', .title) list_2 <- paste0('Contrasts of ', .title) titles_tables <- append(list_1, list_2)
然后调整表格生成逻辑,用map2同时遍历打平后的统计结果列表和标题列表,一一对应赋值标题:
library(purrr) library(broom) library(flextable) # 将嵌套的统计结果列表打平为一维,顺序和titles_tables完全匹配 md_flat <- flatten(md1) tables <- map2(md_flat, titles_tables, ~{ broom::tidy(.x) %>% flextable() %>% colformat_double(digits = 2) %>% theme_box() %>% valign(valign = "center") %>% autofit() %>% set_caption(caption = .y) })
如果需要保留原来的嵌套结构,可以使用嵌套的imap实现:
tables <- imap(md1, function(feature_res, feature_idx) { feature_idx <- as.integer(feature_idx) list( lsmeans = broom::tidy(feature_res[[1]]) %>% flextable() %>% colformat_double(digits = 2) %>% theme_box() %>% valign(valign = "center") %>% autofit() %>% set_caption(caption = list_1[feature_idx]), contrasts = broom::tidy(feature_res[[2]]) %>% flextable() %>% colformat_double(digits = 2) %>% theme_box() %>% valign(valign = "center") %>% autofit() %>% set_caption(caption = list_2[feature_idx]) ) })
内容的提问来源于stack exchange,提问作者12666727b9
相关产品推荐
相关产品推荐

