Error: argument is missing, with no default由于來自呼叫者的尾隨逗號而產生以下代碼 。
new_game <- function(...) {
list(...)
}
game <- new_game(
c(1,2,3),
c(1,2),
c(3),
c(2),
c(1), # the comma here is the culprit
)
是否可以通過簡單地忽略最后一個“引數”來規避這個錯誤?
我想設計這樣我的功能,因為,類似鐵銹是如何尾隨逗號在匹配陳述句或結構,或者怎么走已經尾隨逗號復合文字,它可以更容易地重新排列,添加,洗掉線和提交和拉力的變化。
uj5u.com熱心網友回復:
R 是一個奇怪的野獸,因為即使語法明確允許尾隨逗號,它也不會像其他語言那樣丟棄/忽略它們。相反,R 假裝已經通過了一個“缺失”的引數。只要沒有涉及缺失的論點,那就沒問題了。我們甚至可以在沒有點的情況下使用這種情況:
f = function (a, b, c) a b
由于c從未被讀取,我們不需要傳遞它:
f(1, 2) # works
f(1, 2, ) # works, too
也許不是很有用。但以下也有效:
g = function (a, b, c) a b if (missing(c)) 0 else c
g(1, 2) # 3
g(1, 2, ) # 3
g(1, 2, 3) # 6
……不幸的是,這并不能幫助我們直接捕獲....
使用讀制造解決方案的短(例如rlang::list2),唯一真正的方法來捕獲點(允許尾隨逗號)是對作業未計算引數,并手動評估他們(我們可能反而會傾向于嘗試missing(...elt(...length()));唉R不接受)。
有不同的方法可以獲取未評估的點引數。最簡單的方法是使用match.call(expand.dots = FALSE)$.... 這給我們留下了:
new_game = function (...) {
args = match.call(expand.dots = FALSE)$...
nargs = length(args)
if (identical(args[[nargs]], quote(expr = ))) nargs = nargs - 1L
lapply(args[seq_len(nargs)], eval, envir = parent.frame())
}
uj5u.com熱心網友回復:
事實證明,有一個完整的檔案...可以說明可以在哪里使用...length()和...elt(x)訪問特定引數。我決定將所有內容都放在 try-catch 塊中 - 如果拋出錯誤,可能是由于最后缺少引數(請注意這missing(...elt(...length()))不起作用)。
game <- function(...) {
tryCatch(
list(...),
error = function(e) lapply(1:(...length()-1), function(x) ...elt(x))
)
}
另外rlang提供list2專門為這個用例。
game <- function(...) {
rlang::list2(...)
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/391628.html
