在R中评估函数之前将函数更改为参数?

时间:2010-04-06 20:39:36

标签: r functional-programming lazy-evaluation

在给出作为参数传递的函数之前,有没有办法在评估它之前改变它的输入参数字符串?

这是我希望实现的伪代码:

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中进行评估之前,可以更简单地更改输入参数。

2 个答案:

答案 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表达做什么?您想动态添加行为吗?然后在你的问题中有一个装饰模式。想要选择性地添加行为?代理。在某些情况下需要换掉另一种行为吗?策略。

你依赖于设计模式会好得多 - 无论你使用何种语言,它都可以使你更有效 - 而不是试图使用一些特定于语言的功能,让你改变策略的行为。