Векторизация () против применения ()

Функции Vectorize() и apply() в R часто можно использовать для достижения одной и той же цели. Обычно я предпочитаю векторизовать функцию из соображений удобочитаемости, потому что основная вызывающая функция связана с текущей задачей, а sapply — нет. Это также полезно для Vectorize(), когда я собираюсь использовать эту векторизованную функцию несколько раз в моем коде R. Например:

a <- 100
b <- 200
c <- 300
varnames <- c('a', 'b', 'c')

getv <- Vectorize(get)
getv(varnames)

vs

sapply(varnames, get)

Однако, по крайней мере, на SO я редко вижу примеры с Vectorize() в решении, только apply() (или один из его братьев и сестер). Есть ли какие-либо проблемы с эффективностью или другие обоснованные опасения по поводу Vectorize(), которые делают apply() лучшим вариантом?


person andrew    schedule 01.08.2014    source источник
comment
Хм ... вы запустили свой собственный пример? Я уже вижу там одну проблему с Vectorize...   -  person David Arenburg    schedule 01.08.2014
comment
Ну, я думаю, это начинает отвечать на мой вопрос. Под капотом похоже, что Vectorize() — это просто оболочка для mapply().   -  person andrew    schedule 01.08.2014
comment
Поскольку в вашем примере отсутствует mget(), можете ли вы переписать его с помощью лучшего примера?   -  person smci    schedule 28.05.2018


Ответы (2)


Vectorize — это просто оболочка для mapply. Он просто создает цикл mapply для любой функции, которую вы ему подаете. Таким образом, часто есть более простые вещи, чем Vectorize() это, и явные *apply решения оказываются вычислительно эквивалентными или, возможно, превосходящими.

Кроме того, для вашего конкретного примера вы слышали о mget, верно?

person Thomas    schedule 01.08.2014

Чтобы добавить к ответу Томаса. Может еще и скорость?

    # 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)

введите здесь описание изображения

person Eric Fail    schedule 01.08.2014