1

我想对这样的函数进行矢量化:

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吗?有没有任何简单的替代方法有效?

4

1 回答 1

3

没有任何错误。a[i]评估为c(1,2,3)sincea[0]被忽略。这被回收c(1,2,3,1)来匹配length(i)。所以你0 2 3 1从你那里得到的,ifelse因为第一个元素iFALSE,另一个来自a[i] 回收

不过有一个解决方法:您可以将非正索引替换为NA

> ifelse(i > 0, a[ifelse(i > 0, i, NA)], 0)
[1] 0 1 2 3
于 2013-09-20T01:44:07.330 回答