如何在R的gt包中通过递归管道/循环批量设置多列data_color
简化gt包多列data_color应用的方法
你可以用迭代累积函数来简化重复的data_color()调用,下面是几种可行的方案:
方案1:使用purrr::reduce(推荐)
先把列索引和对应的调色板函数配对,再通过reduce逐个将data_color()应用到gt对象上:
library(gt) library(purrr) library(scales) # 先定义调色板(示例用viridis) colpal <- viridis_pal()(10) df <- data.frame(Var1 = rnorm(30), Var2 = rnorm(30), Var3 = rnorm(30), Var4 = rnorm(30), Var5 = rnorm(30), Var6 = rnorm(30)) # 生成各列对应的调色板函数 cols_to_color <- 2:6 mypals <- map(cols_to_color, ~col_bin(colpal, domain = range(df[[.x]]))) # 配对列索引和调色板 col_pal_pairs <- set_names(mypals, cols_to_color) # 用reduce累积应用data_color gt_table <- df %>% gt() %>% reduce(col_pal_pairs, ~data_color(.x, columns = as.integer(.y), colors = .y), .init = .) gt_table
方案2:使用base R的Reduce
如果不想加载purrr包,用base R的Reduce也能实现:
library(gt) library(scales) colpal <- viridis_pal()(10) df <- data.frame(Var1 = rnorm(30), Var2 = rnorm(30), Var3 = rnorm(30), Var4 = rnorm(30), Var5 = rnorm(30), Var6 = rnorm(30)) cols_to_color <- 2:6 mypals <- lapply(cols_to_color, function(x) col_bin(colpal, domain = range(df[[x]]))) # 构建参数列表,每个元素是data_color的参数 params_list <- Map(function(col, pal) list(columns = col, colors = pal), cols_to_color, mypals) # 用Reduce逐个应用 gt_table <- df %>% gt() %>% Reduce(function(gt_obj, args) do.call(data_color, c(list(gt_obj), args)), params_list, init = .) gt_table
方案3:改进循环写法
直接在循环中修改gt对象,比重复写管道更简洁:
library(gt) library(scales) colpal <- viridis_pal()(10) df <- data.frame(Var1 = rnorm(30), Var2 = rnorm(30), Var3 = rnorm(30), Var4 = rnorm(30), Var5 = rnorm(30), Var6 = rnorm(30)) gt_table <- df %>% gt() cols_to_color <- 2:6 for (col in cols_to_color) { pal <- col_bin(colpal, domain = range(df[[col]])) gt_table <- gt_table %>% data_color(columns = col, colors = pal) } gt_table
说明
- 你原来的递归管道写法问题在于:
gt() %>% seq(2:6)是把gt对象传递给seq(),这不符合逻辑,因为seq()不需要gt对象作为参数。迭代累积的核心是把gt对象作为初始值,逐个应用data_color修改它。 - 上述方案中,每列的调色板定义域都是该列的min到max,和你原来的逻辑完全一致。
内容的提问来源于stack exchange,提问作者Ainhoa
相关产品推荐
相关产品推荐

