在case_when中嵌套if else语句出现异常结果的问题排查
问题原因
case_when的工作机制要求所有右侧表达式返回的向量长度可兼容(即能循环扩展到相同长度)。你的代码中,tipo=="d"分支返回的是长度为2的向量c(3,1)或c(4,1),即使当前匹配的是tipo=="p"分支(返回单个值3),case_when会自动将单个值循环扩展到最长分支的长度(也就是2),因此得到[1] 3 3。
解决方案
你可以根据需求选择以下任意一种方式:
方式1:统一所有分支的返回长度
如果tipo=="d"分支实际不需要返回长度为2的向量,调整为单个值:
tipo="p" n=2 case_when( tipo=="p"~if(n>0){3}else{4}, tipo=="d"~if(n>0){3}else{4}, # 改为单个值 tipo=="r"~3 )
执行后会返回预期的[1] 3。
方式2:改用if-else结构(适合分支返回不同长度的场景)
如果tipo=="d"确实需要返回长度为2的向量,直接用基础的if-else逻辑更合适:
tipo="p" n=2 if(tipo=="p"){ if(n>0){3}else{4} }else if(tipo=="d"){ if(n>0){c(3,1)}else{c(4,1)} }else if(tipo=="r"){ 3 }
这样当tipo="p"时,会正确返回单个值3。
方式3:用列表容纳不同长度结果(返回列表类型)
如果一定要用case_when且保留不同长度的结果,可以将每个分支的结果包装成列表:
tipo="p" n=2 case_when( tipo=="p"~list(if(n>0){3}else{4}), tipo=="d"~list(if(n>0){c(3,1)}else{c(4,1)}), tipo=="r"~list(3) )[[1]] # 取出列表中的元素
执行后会返回3,当tipo="d"时则返回长度为2的向量。
内容的提问来源于stack exchange,提问作者jorgep
相关产品推荐
相关产品推荐

