寻找更高效的ifelse()

时间:2012-01-12 06:57:04

标签: r if-statement

虽然R ifelse非常方便,但它确实有一个特别的缺点:在ifelse(test, yes, no)调用中,yesno的所有元素都会被评估,即使是那些被扔掉了。

如果你在一个复杂的数字练习中使用它,这是相当浪费的,比如在一个函数中,它将被提供给integrateunirootoptim或者其他任何东西。 。例如,一个人可能有

ifelse(test, f(x, y, z), g(a, b, c))

其中fg是任意复杂或慢的函数,可能涉及更多嵌套的ifelse

是否有人写过ifelse的替代品,只会评估将保留的yes / no元素?基本上,就像

那样
out <- test
for(i in seq_along(out))
{
    if(test[i]) out[i] <- f(x[i], y[i], z[i])
    else out[i] <- g(a[i], b[i], c[i])
}

但没有显式循环的笨拙/低效率。如果没有进入R的内部,这甚至可能吗?

1 个答案:

答案 0 :(得分:6)

我不认为问题是ifelsefg仅在您的表达式中进行一次评估。我认为你的问题是fg对于矢量来说很慢。

您可以将调用更改为fg,以便仅在向量的子集上对其进行评估。

out <- numeric(length(test))  #or whatever the output type is
out[test] <- f(x[test], y[test], z[test])
out[!test] <- g(x[!test], y[!test], z[!test])

如果test的任何元素都是NA,则需要对此进行调整。