首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >对提供的参数进行延迟求值

对提供的参数进行延迟求值
EN

Stack Overflow用户
提问于 2009-09-08 17:29:56
回答 3查看 753关注 0票数 7

假设我有以下函数:

代码语言:javascript
运行
复制
foo <- function(x, y = min(m)) {
    m <- 1:10
    x + y
}

当我运行foo(1)时,不出所料,返回值是2。但是,我不能运行foo(1, y = max(m))并接收11,因为惰性计算只对默认参数有效。我怎么能提供一个参数,但它的评估是懒惰的?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-11-04 12:52:19

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

首先将y作为函数传递

代码语言:javascript
运行
复制
foo<-function(x,y=min){
m<-1:10
x+y(m)
}

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

代码语言:javascript
运行
复制
foo<-function(x,y=min(m),m=1:10){
x+y(m)
}

由于这只是一个玩具示例,因此我认为这太微不足道了。如果您坚持要打破作用域,那么您可以将其作为显式计算的表达式进行传递。

代码语言:javascript
运行
复制
foo<-function(x,y=expression(min(m))){
m<-1:10
x+eval(y)
}

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

代码语言:javascript
运行
复制
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

但现在我们开始陷入荒唐的境地。

票数 6
EN

Stack Overflow用户

发布于 2009-09-08 17:30:25

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

代码语言:javascript
运行
复制
R> formals(foo)$y <- call("max", as.name("m"))
R> foo(1)
[1] 11
票数 1
EN

Stack Overflow用户

发布于 2015-05-13 22:20:36

您可以使用substituteeval组合。

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1395233

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档