Vectorize() vs aplica()
-
02-01-2020 - |
Pergunta
O Vectorize()
e o apply()
funções R
muitas vezes pode ser usado para realizar o mesmo objetivo.Eu normalmente prefiro vectorizing uma função para facilitar a leitura razões, porque a principal função de chamada é relacionada à tarefa à mão, enquanto sapply
não é.É útil, também, para Vectorize()
quando eu vou estar usando essa vetorizados função várias vezes na minha R código.Por exemplo:
a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')
getv <- Vectorize(get)
getv(varnames)
vs
sapply(varnames, get)
No entanto, pelo menos ASSIM que eu raramente vejo exemplos com Vectorize()
na solução, apenas apply()
(ou um dos seus irmãos).Há questões de eficiência ou outras preocupações legítimas com Vectorize()
que fazer apply()
uma opção melhor?
Solução
Vectorize
é apenas um wrapper para mapply
.Ele apenas cria uma mapply
loop para qualquer função que você alimentá-lo.Assim, há muitas vezes mais coisas para fazer do que Vectorize()
ele e o explícito *apply
soluções acabam sendo computacionalmente equivalente ou talvez superior.
Também, para o seu exemplo, você já ouviu falar de mget
, certo?
Outras dicas
Adicionar ao Thomas resposta.Talvez, também, a velocidade?
# install.packages(c("microbenchmark", "stringr"), dependencies = TRUE)
require(microbenchmark)
require(stringr)
Vect <- function(x) { getv <- Vectorize(get); getv(x) }
sapp <- function(x) sapply(x, get)
mgett <- function(x) mget(x)
res <- microbenchmark(Vect(varnames), sapp(varnames), mget(varnames), times = 15)
## Print results:
print(res)
Unit: microseconds
expr min lq median uq max neval
Vect(varnames) 106.752 110.3845 116.050 122.9030 246.934 15
sapp(varnames) 31.731 33.8680 36.199 36.7810 100.712 15
mget(varnames) 2.856 3.1930 3.732 4.1185 13.624 15
### Plot results:
boxplot(res)