Не было бы способа разделить аргументы, переданные функции, на два эллипса.Для достижения той же функциональности вы можете заменить один из них аргументом list
;в этом случае графические параметры могут быть естественным выбором, но это зависит от вашего предполагаемого варианта использования.
Чтобы иметь возможность вызывать функции с аргументами, указанными в списке, вы можете использовать do.call
:
do.call создает и выполняет вызов функции из имени или функции и списка аргументов, которые должны быть ему переданы.
bb <- function(..., gpar = list()) {
aa <- function(x, add) {
# here we've replaced the direct calls to the plotting functions with
# indirect calls with a given argument list
if (!add) {
do.call("plot", c(list(density(x)), gpar))
} else {
do.call("lines", c(list(density(x)), gpar))
}
}
z <- list(...)
loop <- seq_len(length(z))
for (i in loop) {
aa(z[[i]], add = i != 1)
}
}
Эта измененная версияфункция должна обеспечивать то, что вы ищете:
set.seed(1)
y1 <- rnorm(200)
y2 <- rnorm(200)
bb(y1, y2, gpar = list(col = "red", lty = 2))

В качестве альтернативы, вы можете использовать эвристику для разделения аргументов, заданных в единственном ...
, для отправки их в правильные функции.В этом случае одной из таких эвристик может быть указание именованных аргументов или нет:
bb2 <- function(...) {
aa <- function(x, add, gpar) {
# removed repetition by doing everything that
# can be done outside of the conditional logic
fun <- if (!add) "plot" else "lines"
args <- c(list(density(x)), gpar)
do.call(fun, args)
}
# capture all arguments
dots <- list(...)
# guarantee character vector of names
nm <- names(dots)
if (is.null(nm)) {
nm <- rep("", length(dots))
}
# pick out named arguments
gpar <- dots[nm != ""]
# loop across unnamed args
z <- dots[nm == ""]
for (i in seq_along(z)) {
aa(z[[i]], add = i != 1, gpar)
}
}
bb2(y1, y2)

bb2(y1, y2, col = "blue", lty = 3)

Создано в 2018 г.-05-23 представьте пакет (v0.2.0).