R语言:如何通过列号而非列名在formattable中指定格式化列?
用列号为formattable表格应用格式化规则的解决方法
你的核心需求是通过列号而非列名给formattable表格设置格式化规则,避免每年因列名变化修改代码。之前的代码失败原因是直接将列数据对象作为格式化规则的键,而formattable需要的是列名或位置定位的规则。以下是两种可行的解决方法:
方法一:通过列号获取列名,动态指定格式化规则
利用列号提取对应列名,再通过tidyeval语法将列名作为格式化规则的键,实现动态绑定:
library(formattable) # 构建示例数据框 bach_STEM_wide <- data.frame( Name = c("Technology", "Science", "Engineering"), "Pct. Diff. from 2013 to 2023" = c(-5.2, 7.3, -1.8), "Pct. Diff. from 2022 to 2023" = c(2.1, -3.5, 1.2)) # 指定目标列的列号 target_col_num <- 2 second_col_num <- 3 # 从列号提取对应列名 target_col_name <- colnames(bach_STEM_wide)[target_col_num] second_col_name <- colnames(bach_STEM_wide)[second_col_num] # 生成formattable表格 formattable(bach_STEM_wide, align = "l", list( Name = formatter( "span", style = x ~ ifelse(x == "Technology", style(font.weight = "bold"), NA)), # 使用!!和:=将列名变量作为规则的键 !!target_col_name := formatter( "span", style = x ~ style(color = ifelse(x < 0 , "orange", "blue")), x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x)), !!second_col_name := formatter( "span", style = x ~ style(color = ifelse(x < 0 , "orange", "blue")), x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x)) ))
方法二:直接用area()通过列号定位列(更推荐)
formattable支持area(col = 列号)语法直接定位目标列,无需处理列名,完全依赖位置设置规则,最适合年度列名变化的场景:
library(formattable) # 构建示例数据框 bach_STEM_wide <- data.frame( Name = c("Technology", "Science", "Engineering"), "Pct. Diff. from 2013 to 2023" = c(-5.2, 7.3, -1.8), "Pct. Diff. from 2022 to 2023" = c(2.1, -3.5, 1.2)) # 生成formattable表格 formattable(bach_STEM_wide, align = "l", list( Name = formatter( "span", style = x ~ ifelse(x == "Technology", style(font.weight = "bold"), NA)), # 直接用列号指定目标列 area(col = 2) ~ formatter( "span", style = x ~ style(color = ifelse(x < 0 , "orange", "blue")), x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x)), area(col = 3) ~ formatter( "span", style = x ~ style(color = ifelse(x < 0 , "orange", "blue")), x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x)) ))
如果需要批量处理所有数值列(比如从第2列到最后一列),可以简化为:
area(col = 2:ncol(bach_STEM_wide)) ~ formatter( "span", style = x ~ style(color = ifelse(x < 0 , "orange", "blue")), x ~ icontext(ifelse(x < 0, "arrow-down", "arrow-up"), x))
内容的提问来源于stack exchange,提问作者tangerine7199
相关产品推荐
相关产品推荐

