如何调整crosstalk复选框选项的排序规则?
解决方案
要自定义crosstalk复选框的选项顺序,核心是把目标列转换成因子(factor),利用因子的水平顺序覆盖默认的字母排序逻辑,针对两种需求分别处理:
1. 按条目数量排序(水果类型)
先统计每种水果的条目数,再将fruit_label转换为因子,水平顺序按条目数从多到少排列:
# 在数据处理环节添加因子转换 fruit_data <- data.frame(fruit = c(rep("apple", 4), rep("banana", 14), rep("pear", 12)), quality = c(rep("awful", 10), rep("okay", 15), rep("amazing", 5))) |> group_by(fruit) |> mutate(fruit_label = paste0(fruit, " (", n(), ")")) |> # 提取括号内的数字,按降序排序后设置因子水平 mutate(fruit_label = factor(fruit_label, levels = fruit_label |> unique() |> arrange(desc(as.numeric(sub(".*\\((\\d+)\\)", "\\1", .)))) |> pull())) |> ungroup()
这样水果类型的复选框就会按「香蕉(14) > 梨(12) > 苹果(4)」的顺序展示。
2. 按自定义因子水平排序(质量)
直接将quality列转换为因子,指定自定义的水平顺序:
# 追加质量列的因子转换 fruit_data <- fruit_data |> mutate(quality = factor(quality, levels = c("amazing", "okay", "awful")))
质量复选框就会严格按照amazing > okay > awful的预设顺序排列。
完整可运行代码
--- title: "Ordering checkboxes from crosstalk" --- ```{r, echo=FALSE, message=FALSE} library(dplyr) library(crosstalk) library(reactable) fruit_data <- data.frame(fruit = c(rep("apple", 4), rep("banana", 14), rep("pear", 12)), quality = c(rep("awful", 10), rep("okay", 15), rep("amazing", 5))) |> group_by(fruit) |> mutate(fruit_label = paste0(fruit, " (", n(), ")")) |> # 按条目数降序设置fruit_label因子水平 mutate(fruit_label = factor(fruit_label, levels = fruit_label |> unique() |> arrange(desc(as.numeric(sub(".*\\((\\d+)\\)", "\\1", .)))) |> pull())) |> ungroup() |> # 自定义quality因子水平顺序 mutate(quality = factor(quality, levels = c("amazing", "okay", "awful"))) shared_data <- SharedData$new(fruit_data) # 注意:两个filter_checkbox的inputId要唯一,原代码重复会导致冲突 filter_checkbox("fruit_filter", "Type", shared_data, ~fruit_label) filter_checkbox("quality_filter", "Quality", shared_data, ~quality) reactable(shared_data, columns = list( fruit_label = colDef(show = FALSE) ))
内容的提问来源于stack exchange,提问作者Ulrik Lyngs
相关产品推荐
相关产品推荐

