Векторизировать() против применить()
-
02-01-2020 - |
Вопрос
Тот Самый Vectorize()
и тот apply()
функции в R
часто может использоваться для достижения одной и той же цели.Обычно я предпочитаю векторизировать функцию по соображениям удобочитаемости, потому что основная вызывающая функция связана с текущей задачей, в то время как sapply
это не так.Это также полезно для Vectorize()
когда я собираюсь использовать эту векторизованную функцию несколько раз в своем R-коде.Например:
a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')
getv <- Vectorize(get)
getv(varnames)
против
sapply(varnames, get)
Однако, по крайней мере, на SO я редко вижу примеры с Vectorize()
в решении используется только apply()
(или один из его братьев и сестер).Существуют ли какие-либо проблемы с эффективностью или другие законные опасения по поводу Vectorize()
это делает apply()
лучший вариант?
Решение
Vectorize
это просто обертка для mapply
.Это просто создает у вас mapply
цикл для любой функции, которую вы ему передаете.Таким образом, часто есть вещи, которые сделать проще, чем Vectorize()
это и явное *apply
решения в конечном итоге оказываются эквивалентными в вычислительном отношении или, возможно, превосходящими их.
Кроме того, для вашего конкретного примера вы слышали о mget
, верно?
Другие советы
Чтобы добавить в ответ Томаса.Может быть, также скорость?
# 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)
.