有什么方法可以预防心脏病吗
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 <- 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()
使用其默认值(这将始终拾取
方法)。
动机(二阶)
chapter from Advanced R
或
wikipedia link
纯净的
和
有效/副作用
我以前可能会通过一些设置来实现
全球的
foo()
可以访问,所以我可以很懒,不把它定义为函数的参数
foo()
foo()
那就要看情况了
外部
它的范围-这在FP中是一件非常糟糕的事情。
现在我想至少说明
foo()
当然,非惰性(也可以说是最好的)解决方案是仔细地将所有实际的设置依赖项逐个声明为函数参数
,例如。
foo(settings_system = settings()$system)
;-)