说我有以下功能:
foo <- function(x, y = min(m)) {
m <- 1:10
x + y
}
当我运行foo(1)
时,返回的值为2
,如预期的那样。但是,我无法运行foo(1, y = max(m))
并接收11
,因为延迟评估仅适用于默认参数。我怎样才能提供一个参数但让它懒洋洋地评估?
答案 0 :(得分: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
但现在我们开始陷入荒谬的境地了。
答案 1 :(得分:1)
我的解决方案是只更改默认参数:
R> formals(foo)$y <- call("max", as.name("m"))
R> foo(1)
[1] 11
答案 2 :(得分: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