为什么我不能在R中分配带ifelse的函数?

时间:2014-02-05 12:50:56

标签: r functional-programming

在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'

如何将两个函数之一分配给变量以及此处发生了什么?

2 个答案:

答案 0 :(得分:5)

由于ifelse是矢量化的,并且不为非矢量化条件提供特殊情况,因此参数将与rep(...)一起复制。 rep(...)无法进行闭包,例如在示例中。

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

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

答案 1 :(得分:1)

<@> @Joshua Ulrich的评论是一个正确的答案。完成条件函数赋值的正确方法是经典if...else而不是矢量化ifelse方法:

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