访问R中的所有函数参数

Dar*_*ook 11 r

我有一个函数f(),它有一些命名参数.它调用函数g(),我想将所有f的参数传递给它.这可能吗?

使用...只是涵盖了额外的参数:

f=function(a,callback,b,c,d,...){
  z=a-b
  callback(z,...) 
  }

g=function(z,...){
  print(list(...))    #Only shows $e
  print(z)    #-1
  print(a,b,c,d)  #'a' not found   
}

f(1,g,2,3,d=4,e=5);
Run Code Online (Sandbox Code Playgroud)

我认为formals()就是答案,但它似乎只是参数名称,而不是它们的价值!

f=function(a,callback,b,c,d,...){
  z=a-b
  callback(z,formals()) 
  }

g=function(z,...){
  args=list(...)[[1]]
  print(args$a) #(no output)
  print(class(args$a))  #"name"
}

f(1,g,2,3,d=4,e=5);
Run Code Online (Sandbox Code Playgroud)

可能吗?谢谢.

Ant*_*kov 16

那么,这样的事情肯定是可能的.你应该自己想一下你想在哪个帧/点评估f的参数然后转发给g.

典型的过程包括f内的match.call()调用实际记录调用f的调用表达式,然后更改调用表达式,因为它应该对你很方便(例如过滤掉不必要的args,添加new等)然后通过eval()调用评估新的调用表达式.所以,这样的事情应该(几乎)起作用:

f <- function(a, callback, b, c, d, ...) {
  # Grab the "f" call expression
  fcall <- match.call(expand.dots = FALSE)

  # Construct the new call expression
  fcall[[1]] <- callback
  # Filter out / add new args
  fcall$callback <- NULL
  fcall$z <- z

  # Do the call
  eval(fcall, parent.frame())
}
Run Code Online (Sandbox Code Playgroud)