代码之家  ›  专栏  ›  技术社区  ›  Shane

在r中对函数求值之前将其作为参数进行更改?

  •  4
  • Shane  · 技术社区  · 14 年前

    给定一个作为参数传递的函数,在对其求值之前是否有任何方法可以更改其输入参数字符串?

    下面是我希望实现的伪代码:

    test.func <- function(a, b) {
        # here I want to alter the b expression before evaluating it:
        b(..., val1=a)
    }
    

    给定传递给的函数调用 b ,我想添加 a 作为另一个参数,不需要总是指定 ... 打电话。所以这个的输出 test.func 电话应该是:

    test.func(a="a", b=paste(1, 2))
    "1"  "2"  "a"
    

    编辑 :

    我可以看到这样做的另一种方式是,如果我可以在父函数的范围内分配额外的参数(同样,作为伪代码);在这种情况下 将在T1和T2的范围内,但不全局分配:

    t2 <- function(...) {
      paste(a=a, ...)
    }
    
    t1 <- function(a, b) {
      local( { a <<- a; b } )
    }
    
    t1(a="a", b=t2(1, 2))
    

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

    编辑2 :

    只想再加一句话:我意识到一个相关的方法是 prototype-based programming “这样事情就可以继承 the proto package )但我希望在r中求值之前能有一种更简单的方法来改变输入参数。

    2 回复  |  直到 14 年前
        1
  •  2
  •   Marek    14 年前

    你查过了吗 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"
    
        2
  •  0
  •   MaxGuernseyIII    14 年前

    你想对b表达式做什么?是否要动态添加行为?那么在您的问题中有一个decorator模式。要选择性地添加行为吗?代理。在某些情况下需要把一种行为换成另一种行为?策略。

    依赖于设计模式(无论使用何种语言,设计模式都能起作用并使您更有效)比尝试使用某种特定于语言的功能(让您改变策略的行为)要好得多。