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?

¿Fue útil?

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)

enter image description here

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top