Чтобы развернуть ответ DWin и свой комментарий к нему, просто следите за 0
и добавьте обратно в тривиальные ответы:
## Dummy data
set.seed(1)
a <- sample(0:10, 100, replace = TRUE)
b <- runif(100)
## something to hold results
out <- numeric(length(a))
## the computations you *want* to do
want <- !a==0
## fill in the wanted answers
out[want] <- a[want] * exp(b[want])
, что дает правильные результаты:
> all.equal(out, a * exp(b))
[1] TRUE
Если вы хотите, вы можете обернуть это в функцию:
myFun <- function(a, b) {
out <- numeric(length(a))
want <- !a==0
out[want] <- a[want] * exp(b[want])
return(out)
}
Затем используйте ее
> all.equal(out, myFun(a, b))
[1] TRUE
Но нет ничего болееэффективнее, чем использование a * exp(b)
напрямую.И *
, и exp()
векторизованы, поэтому они будут выполняться очень быстро, намного быстрее, чем любая из мер по сохранению резервирования, использованных в различных ответах.
Потребности в решениях для учета будут зависетьо том, насколько дорогая ваша функция (exp()
в примере в вашем Q) в вычислительном выражении.Попробуйте оба подхода на небольшой выборке и оцените время (используя system.time()
), чтобы увидеть, стоит ли дополнительных усилий выполнять поднабор для отслеживания 0.