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

为何dplyr::case_when总是计算RHS?代码重复输出.txt异常求助

问题解答

1. 为什么代码会三次返回".txt"?

你的dfs_repaired列表只有1个元素,pmap确实只执行了一次,但dplyr::case_when的特性导致三个分支的print(type)都被执行了:

  • 当case_when运行时,所有分支的右侧表达式(RHS)会被提前全部计算,不会等到条件判断后再执行匹配的分支。
  • 本次执行中type的值是".txt",三个分支的RHS都是print(type),所以三个print语句都会触发,最终输出三次".txt"。

2. 为什么dplyr::case_when总是计算右侧表达式?

这是case_when的设计逻辑——它不支持惰性求值。
和R原生的if/else或ifelse不同,case_when会先完成所有分支右侧代码的计算,再根据左侧条件筛选返回结果。哪怕某个分支的条件不成立,它的右侧表达式依然会被执行,这就是你看到所有print都运行的核心原因。

修正方案

如果希望仅执行匹配条件的分支代码,建议使用原生的if/else链(惰性求值,仅执行满足条件的分支):

dfs_repaired <- list(`x.txt` = data.frame())
export <- purrr::pmap(list(
  data = dfs_repaired,
  path = names(dfs_repaired),
  type = stringr::str_extract(names(dfs_repaired), "\\..*")
),
function(data, path, type) {
  if (type == ".csv") {
    print(type)
  } else if (type == ".xlsx") {
    print(type)
  } else if (type == ".txt") {
    print(type)
  }
}) 

运行这段代码只会输出一次".txt"。

内容的提问来源于stack exchange,提问作者pgitti

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:42:16