Как получить значение list(...) в функциях R и S
Я смущен тем, как list(...)
работает в R и S-плюс. Для следующего кода
pp <- function(x, ...) { print( length( list(...)))}
pp(1,,,1)
В S-Plus это работает, но в R это дает "Error in print(length(list(...))) : argument is missing, with no default
"
Меня больше интересует, как это работает в R и как получить значение list(...)
в функции R.
2 ответа
Я не уверен, почему этот синтаксис разрешен в S-плюс, но не в R.
Здесь, однако, некоторый код R, который будет иметь по существу тот же эффект:
pp <- function(x, ...) {
print(length(as.list(match.call(expand.dots=FALSE))[["..."]]))
}
pp(1,,,1)
# [1] 3
В качестве альтернативы, используя трюк отсюда:
ppp <- function(x, ...) {
print(length(substitute(...())))
}
ppp(1,,,1)
# [1] 3
Вы не можете использовать безымянные (edit: ... и отсутствующие) аргументы в dots
и любые аргументы после dots
когда эти аргументы предназначены для сопоставления в arg-list. Позиционное сопоставление, которое автоматически происходит для безымянных аргументов, "работает" только в типичной обработке аргументов для именованных аргументов (в списке аргументов) перед точками.
> pp1 <- function(x, ...) { length( list(...))}
> pp1(1,z=NULL,xx=NULL,1)
[1] 3
> pp2 <- function(x, z, ...) { length( list(...))}
> pp2(1,z=NULL,xx=NULL,1)
[1] 2
> pp3 <- function(x, z, ...) { length( list(...))}
> pp3(1, ,xx=NULL,1)
[1] 2
> pp <- function(x, ...) { length( list(...))}
> pp(1, , xx=NULL, 1)
Error in pp(1, , xx = NULL, 1) : argument is missing, with no default
Читая страницу справки для match.call, второе "часто используемое обстоятельство" описывается так:
Чтобы передать большую часть вызова другой функции, часто model.frame. Здесь общая идиома заключается в том, что используется expand.dots = FALSE, а элемент... соответствующего вызова удаляется.
Последовательность сопоставления аргументов (если не обойдена) описана в разделе 4.3.2 "Сопоставление аргументов":
- Позиционное соответствие. Любые несогласованные формальные аргументы связаны с неназванными предоставленными аргументами по порядку Если есть аргумент '...', он примет остальные аргументы, помеченные или нет.
Если какие-либо аргументы остаются несогласованными, объявляется ошибка.