簡體   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