为什么我不能在R中使用ifelse分配函数?

7

在 R 中,当我尝试通过 ifelse 分配一个函数时,会出现以下错误:

> my.func <- ifelse(cond, sqrt, identity)
Error in rep(yes, length.out = length(ans)) : 
  attempt to replicate an object of type 'builtin'

如果condFALSE,那么错误信息看起来是相同的,R会抱怨一个。
attempt to replicate an object of type 'closure'

我该如何将两个函数中的一个分配给变量,并且这里发生了什么?

这个问题的灵感来自于并与这个问题相关。 - quazgar
2个回答

5

ifelse是矢量化的,不针对非矢量化条件提供特殊情况,因此参数会使用rep(...)进行复制。但是,像示例中那样,rep(...)无法处理闭包。

解决方法是暂时包装函数:

my.func <- ifelse(cond, c(sqrt), c(identity))[[1]]

1
我会选择使用 switch -- 在许多教程中都有如何使用 switch 来获取不同的函数并将其应用于输入的示例。 - Carl Witthoft
10
可以使用 my.func <- if(cond) sqrt else identity,无需滥用 ifelse - Joshua Ulrich
如果需要,如何将此向量化? - Dr. Andrew John Lowe

1

@Joshua Ulrich的评论是一个正确的答案。实现条件函数分配的正确方法是使用经典的if...else而不是向量化的ifelse方法:

my.func <- if (cond) sqrt else identity

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接