我想对这样的功能进行矢量化:
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
吗?有没有简单的替代方案有效?
答案 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