Хотя я могу представить себе, что это может быть проблематично c, одним из методов может быть использование всех безымянных аргументов для одной цели и требование, чтобы все FUN
аргументы были явно названы.
Слишком упрощение того, что вы используете ...
просто для объединения в путь к файлу:
fetchItem <- function(name, ..., FUN) {
dots <- list(...)
nms <- names(dots)
args1 <- is.null(nms) | nms == ""
list(
nofunargs = c(name = name, dots[args1]),
funargs = dots[!args1]
)
}
str( fetchItem("foo", "bar", FUN = read.csv, stringsAsFactors = FALSE, header = TRUE) )
# List of 2
# $ nofunargs:List of 2
# ..$ name: chr "foo"
# ..$ : chr "bar"
# $ funargs :List of 2
# ..$ stringsAsFactors: logi FALSE
# ..$ header : logi TRUE
Другая альтернатива - это немного fr agile: arguments после того, как FUN=
(должен быть назван) переданы в FUN
, а не в первую цель.
fetchItem2 <- function(name, ..., FUN) {
args <- as.list(sys.call())[-1]
nms <- names(args)
FUNind <- which(nms == "FUN")
if (!length(FUNind)) FUNind <- length(nms) + 1L
list(
nofunargs = args[ seq_len(FUNind - 1L) ],
funargs = args[ -seq_len(FUNind) ]
)
}
str( fetchItem2("foo", "bar", FUN = read.csv, stringsAsFactors = FALSE, header = TRUE, name = "othername") )
# List of 2
# $ nofunargs:List of 2
# ..$ : chr "foo"
# ..$ : chr "bar"
# $ funargs :List of 3
# ..$ stringsAsFactors: logi FALSE
# ..$ header : logi TRUE
# ..$ name : chr "othername"