[英]Defaults of function argument which name correspond to existing function name
有没有办法防止promise already under evaluation
错误promise already under evaluation
的promise already under evaluation
在下面的例子中,当foo(1:5, bar)
工作时, foo(1:5)
会抛出这样的错误。
当然我可以将参数名称从bar
更改为bar_fun
,但如果可能的话,我宁愿坚持使用实际函数的名称。
foo <- function(x, bar = bar) {
bar(x)
}
bar <- function(x) {
UseMethod("bar")
}
bar.default <- function(x) {
sum(x)
}
foo(1:5)
#> Error in foo(1:5): promise already under evaluation: recursive default argument reference or earlier problems?
foo(1:5, bar)
#> [1] 15
真实世界的用例是bar()
实际上是settings()
,这是一个返回设置列表的函数。 我想对这些设置进行版本控制。 因此,有像settings.v1
, settings.v2
,...和settings.default
。 我想使用settings.default
来定义要使用的settings.default
的“运行时版本”,例如:
settings <- function(x) {
UseMethod("settings")
}
settings.v1 <- function(x) {
list(system = "dev")
}
settings.v2 <- function(x) {
list(system = "production")
}
settings.default <- function(x) {
settings.v2(
}
foo <- function(x, settings = settings) {
settings()
}
foo()
#> Error in foo(): promise already under evaluation: recursive default argument reference or earlier problems?
foo(settings = settings)
#> $system
#> [1] "production"
由于settings.default()
调用我想要使用的设置方法,如果我可以使用默认值调用foo()
,那将是很好的(这将始终选择settings.default()
方法)。
我正在尝试更多地遵循函数式编程的原则(参见例如Advanced R或wikipedia链接的 章节 )以及它对纯粹和有效/副作用函数的区分 。
以前,我可能会通过某种全局变量实现设置,因此每个foo()
都可以访问,所以我可能很懒,不能将它定义为函数foo()
的参数,但是foo()
则依赖于关于其范围之外的事情 - 这在FP中是非常糟糕的事情。
现在我想通过将一个函数返回设置值来至少说明foo()
对我的设置的依赖性 - 这有点像我的懒惰,至少在某种程度上符合顶级FP原则。
当然,非懒惰(并且可以说是最好的)解决方案是将foo()
所有实际设置依赖关系一个一个地作为函数参数,例如foo(settings_system = settings()$system)
;-)
1)尝试从父级明确地获取它:
foo <- function(x, bar = get("bar", 1)) {
bar(x)
}
2)另一种可能性是使用参数名称,如bar.
。 用户仍然可以写foo(1:15, bar = whatever)
,例如这三个调用中的任何一个都可以工作:
foo <- function(x, bar. = bar) {
bar.(x)
}
foo(1:5)
foo(1:5, bar)
foo(1:5, bar = bar)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.