[英]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.