如何防止NULL杀死我的ifelse矢量化?

时间:2013-09-20 01:26:14

标签: r vectorization

我想对这样的功能进行矢量化:

if (i > 0)
   fun1(a[i])
else
   fun2(i)

其中fun1, fun2已经过矢量化,a是矢量。

我的尝试:

ifelse(i > 0, fun1(a[i]), fun2(i))

然而这是错误的!

> a <- c(1,2,3,4,5)
> i<-c(0,1,2,3)
> ifelse(i > 0, a[i], 0)
[1] 0 2 3 1 # expected 0 1 2 3

我必须使用sapply吗?有没有简单的替代方案有效?

1 个答案:

答案 0 :(得分:3)

没有错。由于a[i]被忽略,c(1,2,3)的评估结果为a[0]。这会被回收到c(1,2,3,1)以匹配length(i)。因此,您从0 2 3 1获得ifelse,因为i的第一个元素是FALSE,而另一个元素来自a[i] 已回收

虽然有一个工作区:你可以用NA替换非正指数:

> ifelse(i > 0, a[ifelse(i > 0, i, NA)], 0)
[1] 0 1 2 3