7

假设我有以下功能:

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

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

4

3 回答 3

6

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

首先将 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

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

于 2009-11-04T04:52:18.760 回答
1

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

R> formals(foo)$y <- call("max", as.name("m"))
R> foo(1)
[1] 11
于 2009-09-08T17:30:24.923 回答
0

您可以使用substitute,eval组合。

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
于 2015-05-13T14:20:35.503 回答