如何使用 dplyr 的 if_else()
函数使其输出为函数?使用 base
中的 ifelse()
这很简单,但是使用 if_else()
就会出错。这是有意为之的行为还是我无法正确地做到这一点?
x <- 2
ifelse(x == 2, min, max)
#> function (..., na.rm = FALSE) .Primitive("min")
dplyr::if_else(x == 2, min, max)
#> Error in true[rep(NA_integer_, length(condition))]: object of type 'builtin' is not subsettable
由 reprex package 创建于 2021-12-04 (v2.0.0)
最佳答案
你不应该为此使用 ifelse
。 ifelse
和 if_else
用于向量——特别是当您的输入是一个向量而您的输出是一个相同长度的向量时。您不能创建函数向量,因此 ifelse
不是返回函数的好选择。您的代码仅在输入长度为 1 的特殊情况下有效——这就是控制/流函数 if()
的用途。
如果 x
的长度 > 1,您的 ifelse
代码将失败并出现奇怪的错误,请尝试设置 x = 2:3
并运行您的代码。
> x = 2:3
> ifelse(x == 2, min, max)
Error in rep(yes, length.out = len) :
attempt to replicate an object of type 'builtin'
另一方面,if()
仍将检查第一个元素并返回第一个元素的正确结果,同时给出有关输入长度的警告:
> if(x == 2) min else max
function (..., na.rm = FALSE) .Primitive("min")
Warning message:
In if (x == 2) min else max :
the condition has length > 1 and only the first element will be used
当您检查一个长度应始终为 1 的条件时,您应该使用 if(){}else{}
,结果可以是任何表达式,它可以被赋值,或者它可以是运行的任意代码。按预期为向量保存 ifelse
(和 if_else
)。
https://stackoverflow.com/questions/70226329/