【问题标题】:Access all function arguments in R访问 R 中的所有函数参数
【发布时间】:2011-12-05 11:08:50
【问题描述】:

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

有可能吗?谢谢。

【问题讨论】:

  • 查看lmglm 的代码以了解这是如何完成的。
  • @HongOoi 谢谢;它是通过 match.call 完成的(即就像 Anton 的回答一样),尽管 IIUC 它选择只传递某些参数,而不是全部。

标签: r


【解决方案1】:

嗯,这样的事情当然是可能的。您应该自己弄清楚我们希望在哪个框架/点上评估 f 的参数,然后将其转发给 g。

典型的过程包括在 f 内部调用 match.call() 以实际记录调用 f 的调用表达式,然后根据您的方便更改调用表达式(例如过滤掉不必要的参数,添加新的,等),然后通过 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())
}

【讨论】:

  • 或者你可以自己传递额外的参数。更容易理解。
  • @hadley 是的,但随着参数列表的变化,更难维护。在考虑了所有选择之后,在我的实际代码中,我选择了一个包含所有其他参数的命名列表参数。 IE。重构行话中的引入参数对象。所以我只是将一个参数传递给 f(),然后将相同的参数传递给 g()。
  • 另外值得注意的是sys.callmatch.call 相似,但不替换参数名称:使用f(1, callback = list),上面将返回list(a = 1),而使用sys.call 的版本将返回list(1).
  • 因此,尽可能忠实地捕获所有传递的参数的最佳方法是:function(a,b, ...) { call &lt;- sys.call(); call[[1]] &lt;- as.name('list'); args &lt;- eval.parent(call)) }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多