有没有办法,给定一个作为参数传递的函数,在评估它之前改变它的输入参数字符串?
这是我希望实现的伪代码:
test.func <- function(a, b) {
# here I want to alter the b expression before evaluating it:
b(..., val1=a)
}
给定传递给b的函数调用,我想添加一个as作为另一个参数,而不需要总是在b调用中指定….所以这个test.func调用的输出应该是:
test.func(a="a", b=paste(1, 2))
"1" "2" "a"
编辑:
我可以看到做这样的事情的另一种方法是,如果我可以在父函数的范围内分配附加参数(再次,作为伪代码);在这种情况下,a将在t1的范围内,因此在t2范围内,但不是全局分配的:
t2 <- function(...) {
paste(a=a, ...)
}
t1 <- function(a, b) {
local( { a <<- a; b } )
}
t1(a="a", b=t2(1, 2))
这有点类似于currying,因为我将参数嵌套在函数本身中.
编辑2:
只是再添加一条评论:我意识到一个相关的方法可能是使用“prototype-based programming”,这样就可以继承(这可以通过the proto package实现).但我希望在R中进行评估之前,可以更简单地更改输入参数.
最佳答案 你检查替补?我不知道它满足你的需要,但你可以使用它返回隐藏列表结构的事实,你可以修改如下
test.func <- function(a, b) {
f <- substitute(b)
f[["val1"]] <- a
eval(f)
}
test.func(a="a", b=paste(1, 2))
# "1 2 a"