You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:17:47