寻找更高效的ifelse()

Hon*_*Ooi 6 if-statement r

虽然R ifelse是非常方便的,但它确实有一个特别的缺点:在调用中ifelse(test, yes, no)所有元素yesno被评估,甚至那些将被丢弃的元素.

这是相当浪费,如果你在一个复杂的数值锻炼身体的中段使用它,说在被输送到一个功能integrate,uniroot,optim或什么的.例如,有人可能有

ifelse(test, f(x, y, z), g(a, b, c))
Run Code Online (Sandbox Code Playgroud)

其中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])
}
Run Code Online (Sandbox Code Playgroud)

但没有显式循环的笨拙/低效.如果没有进入R的内部,这是否可能?

Ric*_*ton 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])
Run Code Online (Sandbox Code Playgroud)

你需要调整这一点,如果的任何元素test都是NA.

  • 如果`f`和`g`完全被矢量化,那么这是你最好的选择.如果没有,那么任何类型的循环都可以.如果你认为它是丑陋的代码(这是足够公平的)那么你总是可以将它包装在一个函数中并将其隐藏在一个你不经常看的文件中. (4认同)