Вот решение, использующее do.call()
, которое создает и оценивает вызов функции.
Как и подход, с которого вы начали, этот использует тот факт, что вызовы R являются списками, в которых: (а) первый элемент - это имя функции;и (b) все следующие элементы являются аргументами этой функции.
j <- function(x, file) {
Call <- match.call(expand.dots = TRUE)
arglist <- as.list(Call)[-1]
do.call(utils::write.csv, arglist)
}
dat <- data.frame(x=1:10, y=rnorm(10))
j(dat, file="outfilename.csv")
EDIT: FWIW, вот пример из plot.formula
в базе R, которыйиспользует конструкцию, аналогичную приведенной выше:
{
m <- match.call(expand.dots = FALSE)
eframe <- parent.frame()
. . .
. . .
m <- as.list(m)
m[[1L]] <- stats::model.frame.default
m <- as.call(c(m, list(na.action = NULL)))
mf <- eval(m, eframe)
. . .
. . .
}
Функция позже использует конструкцию do.call()
.Если немного углубиться в сорняки, то я прочел, что в показанном здесь фрагменте он использует несколько шагов, главным образом из-за необходимости добавить na.action=NULL
в список аргументов.
В любом случае, этопохоже, что параметры do.call()
настолько близки к каноническим, насколько это возможно.