dplyr::if_else()不';不能将函数作为结果正确运行,而base ifelse()可以完美地运行。为什么?
我理解dplyr::if_else()不';不能将函数作为结果正确运行,而base ifelse()可以完美地运行。为什么?,r,dplyr,R,Dplyr,我理解dplyr::if_else()和baseifelse()之间的主要区别:在前者中,严格检查正确结果和错误结果 然而,我注意到了另一个不同点,我想知道这是故意的行为还是我只是做错了 下面是一些简单的代码: library(dplyr) choose_number <- function() { n <- readline("Choose a number between 1 and 4: ") n <- as.integer(n) if (between(n
dplyr::if_else()
和baseifelse()
之间的主要区别:在前者中,严格检查正确结果和错误结果
然而,我注意到了另一个不同点,我想知道这是故意的行为还是我只是做错了
下面是一些简单的代码:
library(dplyr)
choose_number <- function() {
n <- readline("Choose a number between 1 and 4: ")
n <- as.integer(n)
if (between(n, 1, 4)) { return(n) }
else { return(NA_integer_) }
}
# base ifelse() - works perfectly
get_answer <- function(pick = FALSE, n = 2) {
n <- ifelse(pick, choose_number(), as.integer(n))
return(n)
}
# dplyr::if_else() - does not work in the same way
get_answer <- function(pick = FALSE, n = 2) {
n <- if_else(pick, choose_number(), as.integer(n))
return(n)
}
库(dplyr)
选择\u number原因是dplyr::if\u else()
比ifelse()
更严格
dplyr::if_else()
需要检查true
和false
是否为同一类型和类,然后才能执行。由于choose\u number()
是一个函数,因此需要首先解析它才能进行此类检查,因此即使条件为FALSE,它也会运行
更多信息请点击此处:
您是否在始终单个向量上使用if\u else
?这是不必要的,为什么不使用if
?不管您选择较简单的if
,您都不能依赖向量化的ifelse
或dplyr::if_else
或数据。table::fielse
来短路您的逻辑;通常更安全的假设是,无论您可能的外部条件如何,都将计算所有这两个向量。(事实上,baseif-else
正在做这件事并不意味着if-else
是错的,我想)@r2evans因为愚蠢和疲惫!谢谢-我想我刚刚开始使用dplyr(obv我正在使用的代码更复杂-这里只是一个抽象的示例)。我接受你们关于外在条件满足的观点。我可以使用if和else轻松地重新编写。我想我只是对它为什么不能与dplyr版本一起工作感兴趣。除非你建议删除,否则我将把这个问题留待考虑。有些东西是baseifelse
做错的(或者很差或不一致)。其中一些是(imo)dplyr::if_else
的推动力。(作为两个例子,试一下ifelse(T,Sys.time(),Sys.time())
和ifelse(T,1,“A”)
。第一个去除属性,第二个从数据角度看是不一致的。)我认为主要问题是为什么dplyr::if_else
调用选择编号()
时,首先要选择是FALSE
。