虽然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
.
归档时间: |
|
查看次数: |
1994 次 |
最近记录: |