R语言case_when错误条件触发报错,如何仅在条件为真时执行函数?
问题解决:让case_when仅在条件为TRUE时执行对应代码
问题原因
case_when的所有右侧表达式会被提前整体求值,而非仅在对应条件为TRUE时才执行。所以即使你的y为FALSE,eval(parse(text = x))仍然会被运行,而x = "10+20)"的格式错误导致parse函数报错。
解决方案
方案1:用rowwise()+if逐行处理
通过rowwise()让数据逐行计算,if语句会仅在条件满足时执行对应分支的代码:
library(dplyr) tibble(x = "10+20)", y = FALSE) |> rowwise() |> mutate(prior = if(y) as.character(eval(parse(text = x))) else as.character(x)) |> ungroup()
方案2:用安全函数包裹风险代码
用purrr::possibly创建一个能捕获错误的安全函数,即使错误代码被执行,也不会中断程序:
library(dplyr) library(purrr) # 创建安全的解析求值函数,出错时返回原文本 safe_eval_parse <- possibly(function(txt) { as.character(eval(parse(text = txt))) }, otherwise = txt) tibble(x = "10+20)", y = FALSE) |> mutate(prior = case_when( y ~ safe_eval_parse(x), TRUE ~ as.character(x) ))
方案3:用map2逐元素处理
通过purrr::map2_chr逐对处理y和x,仅在y为TRUE时运行风险代码:
library(dplyr) library(purrr) tibble(x = "10+20)", y = FALSE) |> mutate(prior = map2_chr(y, x, function(y_val, x_val) { if(y_val) as.character(eval(parse(text = x_val))) else as.character(x_val) }))
内容的提问来源于stack exchange,提问作者John-Henry
相关产品推荐
相关产品推荐

