繁体   English   中英

函数参数的默认值,其名称对应于现有函数名称

[英]Defaults of function argument which name correspond to existing function name

有没有办法防止promise already under evaluation错误promise already under evaluationpromise already under evaluation

  1. 您希望函数参数的名称是现有函数的名称
  2. 并且您想为此特定参数设置默认值
  3. 并且您希望能够仅使用其默认值调用外部函数(即,无需向每个参数传递显式值)?

在下面的例子中,当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.v1settings.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 Rwikipedia链接的 章节 )以及它对纯粹有效/副作用函数的区分

以前,我可能会通过某种全局变量实现设置,因此每个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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM