Как получить значение 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 "Сопоставление аргументов":

  1. Позиционное соответствие. Любые несогласованные формальные аргументы связаны с неназванными предоставленными аргументами по порядку Если есть аргумент '...', он примет остальные аргументы, помеченные или нет.

Если какие-либо аргументы остаются несогласованными, объявляется ошибка.

Другие вопросы по тегам