【问题标题】:Lazy evaluation of supplied arguments提供参数的延迟评估
【发布时间】:2010-11-26 14:01:36
【问题描述】:

假设我有以下功能:

foo <- function(x, y = min(m)) {
    m <- 1:10
    x + y
}

当我运行foo(1) 时,返回值是2,正如预期的那样。但是,我无法运行foo(1, y = max(m)) 并接收11,因为惰性求值仅适用于默认参数。我怎样才能提供一个论点但让它懒惰地评估?

【问题讨论】:

  • "惰性求值只适用于默认参数",你确定吗? IIUC 惰性求值发生在所有函数参数上。您的示例不起作用的原因是因为 m 不在调用者的范围内。

标签: r lazy-evaluation


【解决方案1】:

您可以使用substituteeval 组合。

foo <- function(x, y = min(m)) {
  y <- substitute(y)
  m <- 1:10
  x + eval(y)
}

foo(1)
## [1] 2
foo(1, y = max(m))
## [1] 11

【讨论】:

    【解决方案2】:

    简单的答案是您不能也不应该尝试这样做。这打破了范围,如果允许的话,可能会造成严重破坏。有几个选项可以让您以不同的方式思考问题。

    首先将 y 作为函数传递

    foo<-function(x,y=min){
    m<-1:10
    x+y(m)
    }
    

    如果一个简单的函数不起作用,您可以将 m 移动到具有默认值的参数。

    foo<-function(x,y=min(m),m=1:10){
    x+y(m)
    }
    

    由于这是一个玩具示例,我认为这太琐碎了。如果您坚持打破范围,则可以将其作为显式评估的表达式传递。

    foo<-function(x,y=expression(min(m))){
    m<-1:10
    x+eval(y)
    }
    

    然后可以选择从另一个函数返回一个函数。这也可能对您有用,具体取决于您的目的。

    bar<-function(f)function(x,y=f(m)){
    m<-1:10
    x+y
    }
    foo.min<-bar(min)
    foo.min(1)  #2
    foo.max<-bar(max)
    foo.max(1)  #10
    

    但现在我们开始陷入荒谬了。

    【讨论】:

      【解决方案3】:

      我的解决方案是更改默认参数:

      R> formals(foo)$y <- call("max", as.name("m"))
      R> foo(1)
      [1] 11
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-05-17
        • 1970-01-01
        • 1970-01-01
        • 2011-03-03
        • 1970-01-01
        • 2016-06-20
        • 1970-01-01
        相关资源
        最近更新 更多