如何解决R语言中为表格列加颜色刻度时出现的'condition has length >1'错误?
问题
我想给表格中存在的列添加颜色刻度,一共有11个可能的列,每次表格迭代时这些列不一定全部存在。尝试用IF()函数实现,但持续报错:the condition has length >1,想了解问题所在。
代码如下:
all_stats <- data.frame("SEASON" = c("2022-23", "2021-22", "2020-21", "2019-20", "2018-19", "2017-18", "2016-17", "2015-16"), "Cut" = c(1.26,1.31,1.26,1.59,1.39,1.18,2.28,1.00), "Handoff" = c(1.04,1.09,0.77,0.90,0.97,1.05,1.28,0.82), "Isolation" = c(0.97,0.60,0.59,0.92,0.76,0.56,2.04,0.75), "Misc" = c(0.94,0.91,0.88,0.91,0.74,0.92,2.14,0.65), "Off Screens" = c( 1.17,1.08,1.04,0.98,1.08,1.05,2.01,0.82), "PnR Ball Handler" = c(0.88,1.10,1.06,0.81,0.99,0.92,1.89,0.76), "PnR Roll Man" = c(1.26,0.86,0.93,1.36,0.62,1.12,NA,NA)) plays <-c("Cut", "Handoff", "Isolation", "Misc", "Off Screens", "PnR Ball-Handler", "PnR Roll Man", "Postup", "Putbacks", "Spotup", "Transition") t <- all_stats %>% gt() %>% tab_header(title = paste0(playerName," Career Outlook")) %>% cols_label(SEASON = "Season") %>% if(("Cut" %in% plays)){ data_color(columns = Cut, apply_to = "fill", colors = col_numeric(domain = NULL, palette = c('#CF124B','#FFFFFF','#2C5F0D')))
错误信息:
Error in if (.) ("Cut" %in% plays) else { : the condition has length >1
问题原因与解决办法
问题原因
管道符%>%会自动把前一步的gt表格对象传递给下一个函数的第一个参数,直接在管道后写if语句时,这个gt对象会被传给if的隐式参数.,导致原本长度为1的("Cut" %in% plays)逻辑值,与gt对象结合后变成长度大于1的向量,触发报错。
解决办法
方法1:单列条件处理(修正管道内的if逻辑)
用大括号{}包裹if逻辑,明确控制参数传递:
t <- all_stats %>% gt() %>% tab_header(title = paste0(playerName," Career Outlook")) %>% cols_label(SEASON = "Season") %>% { # 检查列是否同时存在于目标列表和当前表格中 if ("Cut" %in% intersect(plays, colnames(.))) { data_color(., columns = Cut, apply_to = "fill", colors = col_numeric(domain = NULL, palette = c('#CF124B','#FFFFFF','#2C5F0D'))) } else { . # 不满足条件时返回原表格对象 } }
方法2:批量处理所有符合条件的列
如果要给所有在plays中且存在于表格里的列都添加颜色刻度,用purrr::reduce批量处理更高效:
library(purrr) # 先筛选出表格中存在的目标列(注意修正列名匹配问题,比如plays里的"PnR Ball-Handler"要和表格列名一致) target_cols <- intersect(plays, colnames(all_stats)) t <- all_stats %>% gt() %>% tab_header(title = paste0(playerName," Career Outlook")) %>% cols_label(SEASON = "Season") %>% reduce(target_cols, ~ data_color(.x, columns = .y, apply_to = "fill", colors = col_numeric(domain = NULL, palette = c('#CF124B','#FFFFFF','#2C5F0D'))), .init = .)
额外注意
你定义的plays列表中,"PnR Ball-Handler"和表格列名"PnR Ball Handler"(空格而非连字符)不匹配,需要修正列名一致,否则该列不会被识别处理。
内容的提问来源于stack exchange,提问作者Ari Eizen
相关产品推荐
相关产品推荐

