如何在R forestplot森林图中无需手动赋值将单个文本元素设为粗体
解决方法
你目前的实现思路是正确的,完全可以不使用is.summary参数实现单个元素加粗,也不需要手动硬编码文本值,只需解决expression()无法自动解析内部变量的问题即可。
expression()不会计算内部的变量值,直接写expression(bold(tabletext_lists[[3]][7]))不会代入实际的文本内容,改用bquote()动态传值就能实现通过索引选择元素直接加粗,具体实现如下:
可复用的加粗封装函数
# 封装动态生成加粗表达式的工具函数 make_bold <- function(text_val) { as.expression(bquote(bold(.(text_val)))) }
完整可运行代码示例
library(forestplot) cochrane_from_rmeta <- structure(list( mean = c(NA, 0.578, 0.165, 0.246, 0.700, 0.348, 0.139, 1.017), lower = c(NA, 0.372, 0.018, 0.072, 0.333, 0.083, 0.016, 0.365), upper = c(NA, 0.898, 1.517, 0.833, 1.474, 1.455, 1.209, 2.831)), .Names = c("mean", "lower", "upper"), row.names = c(NA, -8L), class = "data.frame") tabletext <- cbind( c("Study", "Auckland", "Block", "Doran", "Gamsu", "Morrison", "Papageorgiou", "Tauesch"), c("Deaths", "36", "1", "4", "14", "3", "1", "8"), c("OR", "0.58", "0.16", "0.25", "0.70", "0.35", "0.14", "1.02")) tabletext_lists <- list(list(), list(), list()) tabletext_lists[[1]] <- tabletext[,1] tabletext_lists[[2]] <- tabletext[,2] tabletext_lists[[3]] <- tabletext[,3] # 直接通过索引选择要加粗的元素,无需手动输入文本值 # 对第三列第3行加粗 tabletext_lists[[3]][3] <- lapply(tabletext_lists[[3]][3], make_bold) # 对第三列第7行加粗 tabletext_lists[[3]][7] <- lapply(tabletext_lists[[3]][7], make_bold) # 批量操作示例:给第三列第2、4、6行同时加粗,直接用向量切片即可 # bold_pos <- c(2,4,6) # tabletext_lists[[3]][bold_pos] <- lapply(tabletext_lists[[3]][bold_pos], make_bold) forestplot(tabletext_lists, cochrane_from_rmeta,new_page = TRUE, clip = c(0.1,2.5), xlog = TRUE, col = fpColors(box = c(rep("royalblue", 5), "red", "red"), line = "darkblue"))
效果示例

实现原理
bquote()中的.()语法会先计算括号内的变量值,再将结果代入表达式中,因此可以动态读取你选中的单元格文本内容,传给bold()实现加粗,完全符合常规的向量切片、索引选择操作习惯,不需要手动输入文本值,也不需要依赖is.summary参数。
内容的提问来源于stack exchange,提问作者Stedy
相关产品推荐
相关产品推荐

