对提供的参数进行延迟评估

bre*_*onk 7 r lazy-evaluation

说我有以下功能:

foo <- function(x, y = min(m)) {
    m <- 1:10
    x + y
}
Run Code Online (Sandbox Code Playgroud)

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

And*_*edd 6

简单的答案是你不能也不应该尝试.如果允许的话,这会打破范围并可能造成严重破坏.您可以通过几种方式对问题进行不同的思考.

首先将y作为函数传递

foo<-function(x,y=min){
m<-1:10
x+y(m)
}
Run Code Online (Sandbox Code Playgroud)

如果一个简单的函数不起作用,你可以将m移动到一个默认的参数.

foo<-function(x,y=min(m),m=1:10){
x+y(m)
}
Run Code Online (Sandbox Code Playgroud)

由于这是一个玩具示例,我认为这太微不足道了.如果您坚持打破范围,那么您可以将其作为显式计算的表达式传递.

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

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

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
Run Code Online (Sandbox Code Playgroud)

但现在我们开始陷入荒谬之中.