在给出作为参数传递的函数之前,有没有办法在评估它之前改变它的输入参数字符串?
这是我希望实现的伪代码:
test.func <- function(a, b) {
# here I want to alter the b expression before evaluating it:
b(..., val1=a)
}
鉴于传递给b
的函数调用,我想在a
中添加另一个参数,而无需在...
调用中始终指定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中进行评估之前,可以更简单地更改输入参数。
答案 0 :(得分:2)
您检查substitute
吗?我不知道它满足了你的需求,但你可以使用它返回隐藏的list
结构的事实,你可以修改如下
test.func <- function(a, b) {
f <- substitute(b)
f[["val1"]] <- a
eval(f)
}
test.func(a="a", b=paste(1, 2))
# "1 2 a"
答案 1 :(得分:0)
你想对B表达做什么?您想动态添加行为吗?然后在你的问题中有一个装饰模式。想要选择性地添加行为?代理。在某些情况下需要换掉另一种行为吗?策略。
你依赖于设计模式会好得多 - 无论你使用何种语言,它都可以使你更有效 - 而不是试图使用一些特定于语言的功能,让你改变策略的行为。