使用dplyr的case_when生成序列遇循环匹配错误的解决请求
问题:使用dplyr::case_when生成序列时出现循环匹配错误
问题代码及错误信息
library(dplyr) #> #> Attaching package: 'dplyr' #> The following objects are masked from 'package:stats': #> #> filter, lag #> The following objects are masked from 'package:base': #> #> intersect, setdiff, setequal, union hahaha <- function(variable){ dynamic_var = deparse(substitute(variable)) y_limits = case_when( dynamic_var == "Tcore" ~ seq(37.4, 38.2, 0.1), dynamic_var == "heart_rate" ~ seq(37.4, 38.2, 0.1), dynamic_var == "Tsk" ~ seq(37.4, 38.2, 0.2), dynamic_var == "adaptive_psi_score" ~ seq(37.3, 38.2, 0.1) ) y_limits } hahaha(Tcore) #> Error in `case_when()`: #> ! Can't recycle `dynamic_var == "Tcore"` (size 9) to match `seq(37.4, 38.2, 0.2)` (size 5). #> Backtrace: #> ▆ #> 1. ├─global hahaha(Tcore) #> 2. │ └─dplyr::case_when(...) #> 3. │ └─vctrs::vec_size_common(...) #> 4. └─vctrs::stop_incompatible_size(...) #> 5. └─vctrs:::stop_incompatible(...) #> 6. └─vctrs:::stop_vctrs(...) #> 7. └─rlang::abort(message, class = c(class, "vctrs_error"), ..., call = vctrs_error_call(call))
错误原因
case_when是向量化判断工具,要求所有条件和对应的结果向量长度必须匹配(或可循环回收)。这里dynamic_var是长度为1的字符串,但每个分支返回的seq生成的序列长度各不相同(比如Tcore对应长度9,Tsk对应长度5),case_when尝试对齐这些不同长度的向量时,触发了循环回收错误。
解决方案
改用针对单值判断的分支工具,避开向量化工具的长度匹配限制:
方案1:使用switch函数
library(dplyr) hahaha <- function(variable){ dynamic_var = deparse(substitute(variable)) y_limits = switch(dynamic_var, "Tcore" = seq(37.4, 38.2, 0.1), "heart_rate" = seq(37.4, 38.2, 0.1), "Tsk" = seq(37.4, 38.2, 0.2), "adaptive_psi_score" = seq(37.3, 38.2, 0.1) ) y_limits } # 测试调用 hahaha(Tcore) #> [1] 37.4 37.5 37.6 37.7 37.8 37.9 38.0 38.1 38.2
方案2:使用if-else链
library(dplyr) hahaha <- function(variable){ dynamic_var = deparse(substitute(variable)) if (dynamic_var %in% c("Tcore", "heart_rate")) { seq(37.4, 38.2, 0.1) } else if (dynamic_var == "Tsk") { seq(37.4, 38.2, 0.2) } else if (dynamic_var == "adaptive_psi_score") { seq(37.3, 38.2, 0.1) } else { stop("不支持的变量名称") } } # 测试调用 hahaha(Tsk) #> [1] 37.4 37.6 37.8 38.0 38.2
内容的提问来源于stack exchange,提问作者Jun Hao Kwek
相关产品推荐
相关产品推荐

