为何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
相关产品推荐
相关产品推荐

