虽然R ifelse是非常方便的,但它确实有一个特别的缺点:在调用中ifelse(test, yes, no)所有元素yes和no被评估,甚至那些将被丢弃的元素.
这是相当浪费,如果你在一个复杂的数值锻炼身体的中段使用它,说在被输送到一个功能integrate,uniroot,optim或什么的.例如,有人可能有
ifelse(test, f(x, y, z), g(a, b, c))
Run Code Online (Sandbox Code Playgroud)
其中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])
}
Run Code Online (Sandbox Code Playgroud)
但没有显式循环的笨拙/低效.如果没有进入R的内部,这是否可能?
我认为问题不在于此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.