При написании функции, включающей аргумент ..., ошибка
в имени аргумента не вызовет немедленной ошибки.
особенно раздражает, когда мы забываем расставить точки над аргументом
addxy <- function(..., .x, .y, .z){
.x + .y
}
addxy(.x=1,.y=2)
# [1] 3
addxy(.x=1,y=2)
# Error in addxy(.x = 1, y = 2) : argument ".y" is missing, with no default
В реальной ситуации ошибка может быть менее явной, и y может быть действительным
ввод или нет, так что я не могу отклонить его с самого начала.
Как я могу дать дружественную ошибку в этом случае, чтобы помочь пользователю исправить свой вызов?





Мы можем обернуть вызов функции в try, а затем, если он не работает, сделать некоторые
гимнастика, чтобы проанализировать первоначальный призыв и формальности и определить, что
могло пойти не так.
Помещая все это в одну функцию, мы получаем:
with_friendly_dot_error <- function(fun){
fiendly_fun <- fun
body(fiendly_fun) <- substitute({
MC <- match.call()
MC[[1]] <- quote(fun)
res <- try(eval.parent(MC),silent = TRUE)
if (inherits(res,"try-error")){
frmls <- setdiff(names(formals()),"...")
dot_names <- names(eval(substitute(alist(...))))
candidates <- intersect(paste0(".",dot_names), frmls)
stop(attr(res,"condition")$message,
"\nDid you forget the dots in argument(s): ",
paste0(candidates, collapse = ", ")," ?")
}
res
})
fiendly_fun
}
Работает нормально, если нет ошибок:
with_friendly_dot_error(addxy)(.x=1,.y=2)
# [1] 3
Дает полезную ошибку, когда это уместно:
with_friendly_dot_error(addxy)(.x=1, y=2)
# Error in with_friendly_dot_error(addxy)(.x = 1, y = 2) :
# argument ".y" is missing, with no default
# Did you forget the dots in argument(s): .y ?
Возможно, я не совсем точно сформулировал вопрос, поскольку начал с ответа. У меня может быть ясный ум, любая обратная связь приветствуется (или отрицательный отзыв, никаких обид! : D)