Используя следующую функцию foo() в качестве простого примера, я хотел бы распределить значения, указанные в ..., по возможности двумя различными функциями.
foo <- function(x, y, ...) {
list(sum = sum(x, ...), grep = grep("abc", y, ...))
}
В следующем примере я хотел бы передать na.rm в sum(), а value - на grep(). Но я получаю сообщение об ошибке для неиспользуемого аргумента в grep().
X <- c(1:5, NA, 6:10)
Y <- "xyzabcxyz"
foo(X, Y, na.rm = TRUE, value = TRUE)
# Error in grep("abc", y, ...) : unused argument (na.rm = TRUE)
Похоже, что аргументы были сначала отправлены на grep(). Это верно? Я бы подумал, что R сначала увидит и оценит sum() и вернет ошибку для этого случая.
Кроме того, при попытке разделить аргументы в ..., я столкнулся с проблемой. sum() формальные аргументы NULL, потому что это .Primitive, поэтому я не могу использовать
names(formals(sum)) %in% names(list(...))
Я также не хочу предполагать, что оставшиеся аргументы из
names(formals(grep)) %in% names(list(...))
автоматически передаются в sum().
Как я могу безопасно и эффективно распределять аргументы ... для нескольких функций, чтобы не делалось ненужных оценок?
В долгосрочной перспективе я хотел бы применить это к функциям с длинным списком аргументов ..., аналогичным аргументам download.file() и scan().