访问R中的所有函数参数

访问R中的所有函数参数,r,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

我有一个函数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);
我以为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);

可能吗?谢谢。

好吧,这样的事情当然是可能的。你应该自己计算一下,在哪一帧/哪一点上,你想计算f的参数,然后把它转发给g

典型的过程包括在f中调用match.call(),以实际记录调用f的调用表达式,然后根据需要更改调用表达式(例如,过滤掉不必要的参数、添加新的参数等),然后通过eval()调用计算新的调用表达式。因此,类似这样的方法应该(几乎)奏效:


f或者您可以自己传递额外的参数。更容易理解。@hadley是的,但随着参数列表的更改,维护起来更困难。在考虑了所有的选择之后,在我的实际代码中,我选择了一个包含所有其他参数的命名列表参数。例如,在重构行话中引入参数对象。因此,我只是将一个参数传递给f(),而将相同的参数传递给g()。同样值得注意的是,
sys.call
类似于
match.call
,但不替换参数名称:使用
f(1,callback=list)
,上述参数将返回
list(a=1)
而带有
sys.call
的版本将返回
list(1)
。因此,尽可能忠实地捕获所有传递的参数的最佳方法是:
function(a,b,…){call请查看
lm
glm
的代码,看看这是如何完成的。@HongOoi谢谢;这是用match.call完成的(即,就像安东的回答一样),尽管IIUC选择只传递某些参数,而不是全部参数。
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())
}