Я не уверен, насколько реалистично c эта установка, но проблема с ней в том, что вызов bar(x)
означает, что вы звоните bar.A(x)
, затем (через NextMethod()
) вы звоните bar.default(x)
, а не bar.default(x, a = 3)
, как вы могли бы ожидать.
Обходной путь - специально передать a
в качестве параметра в NextMethod
. Проблема, с которой вы столкнетесь при этом, заключается в том, что если пользователь не называет второй параметр, то bar.default
сгенерирует, потому что ему дается 3 параметра вместо двух (x
, 2
и a = 3
). Вы можете обойти это, включив параметр ...
в bar.default
, чтобы неназванные параметры игнорировались.
x <- structure(NA, class = "A")
expected <- list(x = x, a = 3)
bar <- function(x, ...) UseMethod("bar")
bar.A <- function(x, a = 2) {
a <- a + 1
NextMethod("bar", x, a = a)
}
bar.default <- function(x, ..., a = 2) {
list(x = x, a = a)
}
identical(bar(x, a = 2), expected)
#> [1] TRUE
identical(bar(x, 2), expected)
#> [1] TRUE
identical(bar(x), expected)
#> [1] TRUE
Создано в 2020-04-02 пакетом prex (v0.3.0)