在KableExtra中使用ifelse条件为cell_spec设置tooltip的问题
解决方案
问题原因
代码存在三个核心问题:
- 嵌套ifelse的else分支返回NULL会触发向量长度不匹配报错,ifelse要求三个分支的返回值长度一致,NULL为长度0的对象,无法适配单元格向量长度
- 枚举所有A*-D*的判断规则灵活性差,新增其他带星值时需要手动补充规则
- 原代码中管道符存在笔误,残缺的
%会触发语法报错
修复后可运行代码
# 加载依赖包 library(dplyr) library(stringr) library(kableExtra) col1 <- c("A", "A*","B**") col2 <- c("A**", "B", "C") col3 <- c("A*", "B*", "C*") Test <- data.frame(col1,col2,col3) Test %>% mutate(across(col1:col3, ~ cell_spec( ., "html", tooltip = case_when( # 优先匹配末尾2个星号的单元格 str_detect(., "\\*{2}$") ~ "Satisfactory to 48°C", # 再匹配末尾1个星号的单元格 str_detect(., "\\*{1}$") ~ "Satisfactory to 22°C", # 其余单元格返回NA,不生成tooltip TRUE ~ NA_character_ ) ))) %>% kable(format = "html", escape = FALSE) %>% kable_styling(full_width = FALSE, bootstrap_options = c("striped","responsive", "hover"))
关键修改说明
- 用
stringr::str_detect正则匹配末尾星号数量,无需枚举所有带星的取值,后续新增带星的观测值无需修改判断规则 - 用可读性更高的
case_when替代嵌套ifelse,条件逻辑更清晰,适合多分支判断场景 - 无匹配场景返回
NA_character_而非NULL:cell_spec的tooltip参数会自动识别NA值,不会为对应单元格生成tooltip属性,同时符合向量长度匹配要求 - 用dplyr 1.0.0及以上版本推荐的
across语法替代已淘汰的mutate_at,语法更规范 - 修正了原代码中管道符的笔误,统一使用标准的
%>%管道符
如果需要兼容旧版dplyr,可将across部分替换为原有mutate_at写法:
mutate_at(vars(col1:col3), ~ cell_spec( ., "html", tooltip = ifelse(str_detect(., "\\*{2}$"), "Satisfactory to 48°C", ifelse(str_detect(., "\\*{1}$"), "Satisfactory to 22°C", NA_character_)) ))
内容的提问来源于stack exchange,提问作者jnasta214
相关产品推荐
相关产品推荐

