Using “…” and “replicate”

前端 未结 4 1013
庸人自扰
庸人自扰 2020-12-20 11:47

In the documentation of sapply and replicate there is a warning regarding using ...

Now, I can accept it as such, but would li

相关标签:
4条回答
  • 2020-12-20 11:57

    An alternative way to do that:

    g <- function(x, y) x + y
    
    f <- function(a = 1, ...) {
        arg_list <- list(...)
        replicate(n = 3, expr = do.call(g, args = arg_list))
    }
    
    f(x = 1, y = 2)
    
    0 讨论(0)
  • 2020-12-20 12:05

    ?replicate, in the Examples section, tells us explicitly that what you are trying to do does not and will not work. In the Note section of ?replicate we have:

         If ‘expr’ is a function call, be aware of assumptions about where
         it is evaluated, and in particular what ‘...’ might refer to.  You
         can pass additional named arguments to a function call as
         additional named arguments to ‘replicate’: see ‘Examples’.
    

    And if we look at Examples, we see:

     ## use of replicate() with parameters:
     foo <- function(x=1, y=2) c(x,y)
     # does not work: bar <- function(n, ...) replicate(n, foo(...))
     bar <- function(n, x) replicate(n, foo(x=x))
     bar(5, x=3)
    

    My reading of the docs is that they do far more than warn you about using ... in replicate() calls; they explicitly document that it does not work. Much of the discussion in that help file relates to the ... argument of the other functions, not necessarily to replicate().

    0 讨论(0)
  • 2020-12-20 12:08

    If you look at the code for replicate:

    > replicate
    function (n, expr, simplify = TRUE) 
    sapply(integer(n), eval.parent(substitute(function(...) expr)), 
        simplify = simplify)
    <environment: namespace:base>
    

    You see that the function is evaluated in the parent frame, where the ... from your calling function no longer exists.

    0 讨论(0)
  • 2020-12-20 12:10

    There actually is a way to do this:

    # Simple function:
    ff <- function(a,b) print(a+b)
    
    # This will NOT work:
    testf <- function(...) {
      replicate(expr = ff(...), n = 5)
    }
    testf(45,56) # argument "b" is missing, with no default
    
    # This will:
    testf <- function(...) {
      args <- as.list(substitute(list(...)))[-1L]
      replicate(expr = do.call(ff, args), n = 5)
    }
    testf(45,56) # 101
    
    0 讨论(0)
提交回复
热议问题