代码之家  ›  专栏  ›  技术社区  ›  Maju116

R: 如何获取函数参数的参数

  •  1
  • Maju116  · 技术社区  · 7 年前

    假设我有一个 function 还需要两个 functions 有一些 arguments 论据 :

    a <- function(x, y = 2){
      x + y
    }
    
    b <- function(b1, b2 = 7){
      b1 + b2
    }
    
    x <- function(x1, x2){
      # Get arguments of arguments
    }
    

    有没有办法得到 论据 从…起 x() 论据?这是通话后:

    x(a(3,4), b(5))
    

    我想得到如下列表:

    $x1
    $x1$x
    [1] 3
    
    $x1$y
    [1] 4
    
    
    $x2
    $x2$b1
    [1] 5
    
    $x2$b2
    [1] 7
    
    1 回复  |  直到 7 年前
        1
  •  1
  •   Roland    7 年前
    x <- function(x1, x2){
    
      theCall <- lapply(as.list(match.call()),as.list)[-1]
    
    
      args <- lapply(theCall, function(x) as.list(formals(as.character(x))))
    
      Map(function(a, b) {
        b <- b[-1]
    
        for (i in seq_along(a)) {
          if(i <= length(b)) a[i] <- b[i]
        }
        a
      }, args, theCall)
    }
    
    str(x(a(3,4), b(5)))
    #List of 2
    # $ x1:List of 2
    #  ..$ x: num 3
    #  ..$ y: num 4
    # $ x2:List of 2
    #  ..$ b1: num 5
    #  ..$ b2: num 7
    

    显然,即使使用有效的函数调用,也很容易破坏这一点:

    str(x(a(3,4), b(,b1 = 5)))
    #List of 2
    # $ x1:List of 2
    #  ..$ x: num 3
    #  ..$ y: num 4
    # $ x2:List of 2
    #  ..$ b1: symbol 
    #  ..$ b2: num 5
    

    让此函数对所有可能的输入都正确,这是读者的练习。