Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/74.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
dplyr::if_else()不';不能将函数作为结果正确运行,而base ifelse()可以完美地运行。为什么?_R_Dplyr - Fatal编程技术网

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()
和base
ifelse()
之间的主要区别:在前者中,严格检查正确结果和错误结果

然而,我注意到了另一个不同点,我想知道这是故意的行为还是我只是做错了

下面是一些简单的代码:

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
来短路您的逻辑;通常更安全的假设是,无论您可能的外部条件如何,都将计算所有这两个向量。(事实上,base
if-else
正在做这件事并不意味着
if-else
是错的,我想)@r2evans因为愚蠢和疲惫!谢谢-我想我刚刚开始使用dplyr(obv我正在使用的代码更复杂-这里只是一个抽象的示例)。我接受你们关于外在条件满足的观点。我可以使用if和else轻松地重新编写。我想我只是对它为什么不能与dplyr版本一起工作感兴趣。除非你建议删除,否则我将把这个问题留待考虑。有些东西是base
ifelse
做错的(或者很差或不一致)。其中一些是(imo)dplyr::if_else
的推动力。(作为两个例子,试一下
ifelse(T,Sys.time(),Sys.time())
ifelse(T,1,“A”)
。第一个去除属性,第二个从数据角度看是不一致的。)我认为主要问题是为什么
dplyr::if_else
调用
选择编号()
时,首先要选择
FALSE