简体   繁体   中英

R: how to use replicate() with ellipsis …?

I want to wrap a replicate() call in a function, using the ellipsis. Say:

  • fo() has 2 arguments: fo <- function(x, times) x * times
  • replicate() will pass the first by name, the second using the ... . rep_it <- function(N, ...) replicate(N, fo(x=3, ...))

It turns out, instead of passing the second argument, replicate seems to be passing 0 values?

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

This seems to be due to the ellipsis! If I were to name the argument, that would be fine:

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

Why is this happening, and how to handle it? I see that there is a quite complicated call inside the replicate() function: eval.parent(substitute(function(...) expr)) , but I don't really understand what is happening there...

Thanks!

We capture the ... and pass it in 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

EDIT: Modified according to @Julius Vainora's suggestion

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM