"..1" в теле "[[.data.frame" - PullRequest
       19

"..1" в теле "[[.data.frame"

17 голосов
/ 30 августа 2011

Когда я смотрю содержимое [[.data.frame на моем ПК, я получаю следующее:

> get("[[.data.frame")
function (x, ..., exact = TRUE) 
{
    na <- nargs() - (!missing(exact))
    if (!all(names(sys.call()) %in% c("", "exact"))) 
        warning("named arguments other than 'exact' are discouraged")
    if (na < 3L) 
        (function(x, i, exact) if (is.matrix(i)) 
            as.matrix(x)[[i]]
        else .subset2(x, i, exact = exact))(x, ..., exact = exact)
    else {
        col <- .subset2(x, ..2, exact = exact)
        i <- if (is.character(..1)) 
            pmatch(..1, row.names(x), duplicates.ok = TRUE)
        else ..1
        .subset2(col, i, exact = exact)
    }
}
<environment: namespace:base>

Я привык к ..., но впервые вижу..1 и ..2.Быстрый поиск как в R-справке, так и в Google дал в основном мусор, поскольку точки часто интерпретируются как заполнители, так что я надеюсь, что кто-то здесь может дать мне указатель?Или я упускаю что-то ужасно очевидное?Откуда они берутся и как их использовать?

Ответы [ 2 ]

16 голосов
/ 30 августа 2011

Это способ ссылки на 1-й, 2-й, ... элементы специального pairlist, который является .... Таким образом, ..1 - это способ обращения к первому элементу ..., ..2 относится ко второму элементу ... и т. Д.

Это упоминается в руководстве R Internals в разделе 1.5.2 Аргументы точка-точка-точка , соответствующий бит которого:

Значение ... является (специальным) паирлистом, элементы которого обозначаются специальными символами ..1, ..2, ..., для которых установлен бит DDVAL: при обнаружении одного из них он просматривается (через ddfindVar) в значении символа ... в кадре оценки.

5 голосов
/ 30 августа 2011

Чтобы добавить к ответу Гевина:

Они также кратко упоминаются на странице справки для зарезервированных слов (?Reserved).

Действительно простой пример использования -

f <- function(...) print(..1)
f(x = 99)  #prints 99
f()        #throws an error
...