代码之家  ›  专栏  ›  技术社区  ›  Rappster

与现有函数名对应的函数参数的默认值

  •  3
  • Rappster  · 技术社区  · 7 年前

    有什么方法可以预防心脏病吗 promise already under evaluation

    1. 您希望为此特定参数设置默认值
    2. 您希望能够仅使用其默认值调用外部函数(即,不需要向每个参数传递显式值)?

    在我下面的例子中 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) ;-)

    1 回复  |  直到 7 年前
        1
  •  3
  •   G. Grothendieck    7 年前

    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)