r - 使用具有功能真/假值的 dplyr 的 if_else 函数

问题

如何使用 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)

最佳答案

你不应该为此使用 ifelseifelseif_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/

相关文章:

javascript - Firebase 9 和 ref 函数与 Vue 组合

c++ - OpenGL 减慢 5k 点

c++ - 将 C 识别的指针类型定义为内部 C++ 类

javascript - 集群两个对象数组javascript

awk - 将字符串附加到 awk 输出

r - 使用管道 %>% 在 R 中创建日期序列

node.js - 无法连接到远程 redis 主机 [nodeJS]

java - 将类似的方法重构为 Java 中的泛型方法

python - 是否有一个 Python 函数可以检查任何列表元素是否属于特定数据类型?

node.js - 如何使用 Node.js 从 Supabase 存储中保存文件(将 blob 转