访问R中的所有函数参数
我有一个函数f(),它有一些命名参数。它调用一个函数g(),我想把f的所有参数传递给它。这可能吗 使用。。。仅介绍额外的参数:访问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=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())
}