Vectorizar() vs aplicar()
-
02-01-2020 - |
Pregunta
El Vectorize()
y el apply()
funciones en R
A menudo se puede utilizar para lograr el mismo objetivo.Por lo general, prefiero vectorizar una función por razones de legibilidad, porque la función de llamada principal está relacionada con la tarea en cuestión, mientras que sapply
no es.También es útil Vectorize()
cuando voy a usar esa función vectorizada varias veces en mi código R.Por ejemplo:
a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')
getv <- Vectorize(get)
getv(varnames)
vs
sapply(varnames, get)
Sin embargo, al menos en SO, rara vez veo ejemplos con Vectorize()
en la solución, sólo apply()
(o uno de sus hermanos).¿Existen problemas de eficiencia u otras preocupaciones legítimas con Vectorize()
eso hace apply()
una mejor opción?
Solución
Vectorize
es solo un envoltorio para mapply
.Simplemente te construye un mapply
bucle para cualquier función que le alimentes.Por lo tanto, a menudo hay cosas más fáciles de hacer que Vectorize()
eso y lo explícito *apply
las soluciones terminan siendo computacionalmente equivalentes o quizás superiores.
Además, para su ejemplo específico, ha oído hablar de mget
, ¿bien?
Otros consejos
Para agregar a la respuesta de Thomas.¿Quizás también la velocidad?
# 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)