Ищете более эффективный ifelse () - PullRequest
6 голосов
/ 12 января 2012

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

1 Ответ

6 голосов
/ 12 января 2012

Не думаю, что проблема в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...