Хотя 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?