我有一个函数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);
有可能吗?感谢。
答案 0 :(得分:15)
嗯,这样的事情肯定是可能的。你应该自己想象一下你想在哪个帧/点评估f的参数然后转发给g。
典型的过程包括f内的match.call()调用实际记录调用f的调用表达式,然后更改调用表达式,因为它应该对你很方便(例如过滤掉不必要的args,添加新的,然后通过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())
}