R: как использовать replicate () с многоточием ...? - PullRequest
0 голосов
/ 07 января 2019

Я хочу обернуть вызов replicate() в функцию, используя многоточие. Скажи:

  • fo() имеет 2 аргумента: fo <- function(x, times) x * times
  • replicate() передаст первое по имени, второе с помощью .... rep_it <- function(N, ...) replicate(N, fo(x=3, ...))

Получается, что вместо передачи второго аргумента функция replicate, похоже, передает 0 значений?

fo <- function(x, times)  x * times
rep_it <- function(N, ...) replicate(N, fo(x=3, ...)) 
rep_it(5, times = 4) # should return 5 times 3 * 4 = 12
#> [1] 0 0 0 0 0

Это, похоже, из-за многоточия! Если бы я назвал аргумент, это было бы хорошо:

rep_it2 <- function(N, times) replicate(N, fo(x=3, times)) 
rep_it2(5, times = 4)
#> [1] 12 12 12 12 12

Почему это происходит и как с этим справиться? Я вижу, что внутри функции replicate() есть довольно сложный вызов: eval.parent(substitute(function(...) expr)), но я не совсем понимаю, что там происходит ...

Спасибо!

1 Ответ

0 голосов
/ 07 января 2019

Мы фиксируем ... и передаем его в replicate

fo <- function(x, times)  x * times
rep_it <- function(N, ...) {
    args <- unlist(list(...), use.names = FALSE)
    replicate(N, fo(x = 3, times = args))
   }


rep_it(5, times = 4) 
#[1] 12 12 12 12 12

РЕДАКТИРОВАТЬ: Изменено в соответствии с предложением @Julius Vainora

...