Date Редакция Категория Comp Теги R

Допустим, вы хотите подсчитать среднее значение последовательности чисел

mean(1:10)

но по ходу работы нужно передать функции дополнительные настройки. В этом случае можно формировать список аргументов постепенно, а затем передать его функции для выполнения.

Создайте список аргументов функции:

arg <- list(1:10, na.rm = TRUE)

Мы добавили в него "обрезку" пропущенных данных.

Нам понадобится функция do.call(), чтобы с её передать список аргументов для mean():

do.call(mean, arg)
# Эквивалентно: mean(1:10, na.rm = TRUE)

#> [1] 5.5

Ещё один пример, с функцией plot():

arg <- list(x=1:5, y=(1:5)^2, main="Y by X", type="b", xlab="X", ylab="Y")
do.call(plot, arg)

Однако, вариант с do.call() всё же несколько медленнее непосредственного вызова:

n <- 1000000
arg <- list(1:10, na.rm = TRUE)

system.time(
  for (i in 1:n)
    mean(1:10, na.rm = TRUE)
)
#пользователь      система       прошло 
#        6.18         0.00         6.21 

system.time(
  for (i in 1:n)
    do.call(mean, arg)
)
#пользователь      система       прошло 
#        7.81         0.00         7.83 


Комментарии

comments powered by Disqus