Split up `…` arguments and distribute to multiple functions

后端 未结 3 1360
温柔的废话
温柔的废话 2020-11-27 05:22

Using the following function foo() as a simple example, I\'d like to distribute the values given in ... two different functions, if possible.

3条回答
  •  没有蜡笔的小新
    2020-11-27 05:42

    Separate Lists If you really want to pass different sets of parameters to different functions then it's probably cleaner to specify separate lists:

    foo <- function(x, y, sum = list(), grep = list()) {
     list(sum = do.call("sum", c(x, sum)), grep = do.call("grep", c("abc", y, grep)))
    }
    
    # test
    
    X <- c(1:5, NA, 6:10)
    Y <- "xyzabcxyz"
    foo(X, Y, sum = list(na.rm = TRUE), grep = list(value = TRUE))
    
    ## $sum
    ## [1] 55
    ## 
    ## $grep
    ## [1] "xyzabcxyz"
    

    Hybrid list / ... An alternative is that we could use ... for one of these and then specify the other as a list, particularly in the case that one of them is frequently used and the other is infrequently used. The frequently used one would be passed via ... and the infrequently used via a list. e.g.

    foo <- function(x, y, sum = list(), ...) {
     list(sum = do.call("sum", c(x, sum)), grep = grep("abc", y, ...))
    }
    
    foo(X, Y, sum = list(na.rm = TRUE), value = TRUE)
    

    Here are a couple of examples of the hybrid approach from R itself:

    i) The mapply function takes that approach using both ... and a MoreArgs list:

    > args(mapply)
    function (FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE) 
    NULL
    

    ii) nls also takes this approach using both ... and the control list:

    > args(nls)
    function (formula, data = parent.frame(), start, control = nls.control(), 
        algorithm = c("default", "plinear", "port"), trace = FALSE, 
        subset, weights, na.action, model = FALSE, lower = -Inf, 
        upper = Inf, ...) 
    NULL
    

提交回复
热议问题