R 提供的参数的惰性计算

R 提供的参数的惰性计算,r,lazy-evaluation,R,Lazy Evaluation,假设我有以下功能: foo <- function(x, y = min(m)) { m <- 1:10 x + y } foo我的解决方案是只更改默认参数: R> formals(foo)$y <- call("max", as.name("m")) R> foo(1) [1] 11 R>formals(foo)$y foo(1) [1] 11 简单的答案是,你不能也不应该尝试这样做。这打破了范围,如果允许的话,可能造成严重破坏。有几个选项可以

假设我有以下功能:

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

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

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

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

作为函数的首次传递y

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

foo您可以使用
替代品
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

foo“惰性计算只对默认参数有效”,你确定吗?IIUC惰性求值与所有函数参数一起发生。示例不起作用的原因是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
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