【问题标题】:Alter a function as a parameter before evaluating it in R?在 R 中评估函数之前将函数更改为参数?
【发布时间】:2023-03-11 22:49:01
【问题描述】:

如果给定作为参数传递的函数,有什么方法可以在计算之前更改其输入参数字符串?

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

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))

这有点类似于柯里化,因为我将参数嵌套在函数本身中。

编辑 2

对此再添加一条评论:我意识到一种相关的方法可能是使用“prototype-based programming”,以便继承事物(可以使用the proto package 实现)。但我希望有一种更简单的方法来在 R 中进行评估之前简单地更改输入参数。

【问题讨论】:

  • 你能给出一个现实的问题吗?可能需要重新考虑您的方法。

标签: r functional-programming lazy-evaluation


【解决方案1】:

你想对 B 表达式做什么?您想动态添加行为吗?然后在您的问题中有一个装饰器模式。想要选择性地添加行为?代理。在某些情况下需要将一种行为换成另一种行为吗?策略。

与尝试使用某些特定于语言的功能(让您改变策略的行为)相比,您最好依靠设计模式(无论您使用何种语言,设计模式都能发挥作用并让您更有效)。

【讨论】:

    【解决方案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"
    

    【讨论】:

    • 这正是我想要的。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-20
    • 1970-01-01
    相关资源
    最近更新 更多