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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 14:37:15