Нет, поскольку unlist
и c
(при применении к атомарным векторам разных типов) создают атомарный вектор и по определению они должны быть одного типа , Список в R является самым общим из векторов, и вы можете использовать его, фактически аргумент "args"
для do.call
запрашивает для списка, и вы предоставляете атомарный вектор (используя c()
).
Зачем использовать do.call
, когда все, что вы делаете, - это создание нового устройства? Если все, что вам нужно, это обертка для png
, которая устанавливает некоторые значения по умолчанию, чтобы вам не приходилось печатать все это каждый раз, когда вы хотите использовать устройство png
, то вы слишком сложны. Примерно так будет достаточно:
my.png <- function(name, height = 500, width = 500, ...) {
png(filename = name, height = height, width = width, ...)
}
Если вам нужна более общая оболочка, то что-то вроде:
my.wrapper <- function(dev, name, ...) {
dev(filename = name, ...)
}
должно хватить. Вы бы использовали это как:
my.wrapper(png, "my_png.png", height = 500, width = 200, pointsize = 12)
или
my.wrapper(pdf, "my_pdf.pdf", height = 8, width = 6, version = "1.4")
Если вы хотите работать с ...
, вы можете, например ::
my.wrapper2 <- function(dev, name, ...) {
dotargs <- list(...)
writeLines("my.wrapper2, called with the following extra arguments:")
print(dotargs)
## do nothing now...
}
Что дает:
> my.wrapper2(pdf, "foo.pdf", height = 10, width = 5, pointsize = 8,
+ version = "1.3")
my.wrapper2, called with the following extra arguments:
$height
[1] 10
$width
[1] 5
$pointsize
[1] 8
$version
[1] "1.3"
Так что вы можете программно выдвигать аргументы, которые вы хотите, и o, что вы хотите с ними.
Еще одна вещь, которая только что пришла мне в голову, - это то, что вы можете использовать c
для объединения дополнительных компонентов в списки:
> c(filename = "name", list(height = 500, width = 500))
$filename
[1] "name"
$height
[1] 500
$width
[1] 500
Так что, если вы действительно хотите применить do.call
к набору аргументов, тогда
my.wrapper3 <- function(dev, name, ...) {
dotargs <- list(...)
## concatenate with name
callArgs <- c(filename = name, dotargs)
## use do.call
do.call(dev, args = callArgs)
}
Но это может быть более легко достигнуто с my.wrapper
выше.