虽然R ifelse
非常方便,但它确实有一个特别的缺点:在ifelse(test, yes, no)
调用中,yes
和no
的所有元素都会被评估,即使是那些被扔掉了。
如果你在一个复杂的数字练习中使用它,这是相当浪费的,比如在一个函数中,它将被提供给integrate
,uniroot
,optim
或者其他任何东西。 。例如,一个人可能有
ifelse(test, f(x, y, z), g(a, b, c))
其中f
和g
是任意复杂或慢的函数,可能涉及更多嵌套的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的内部,这甚至可能吗?
答案 0 :(得分:6)
我不认为问题是ifelse
。 f
和g
仅在您的表达式中进行一次评估。我认为你的问题是f
和g
对于矢量来说很慢。
您可以将调用更改为f
和g
,以便仅在向量的子集上对其进行评估。
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
,则需要对此进行调整。