Использование `...` (три точки или точка-точка-точка) в функциях - PullRequest
80 голосов
/ 05 мая 2011

Где я могу найти документацию по использованию ... в функциях?Примеры будут полезны.

Ответы [ 3 ]

72 голосов
/ 05 мая 2011

Слово, используемое для описания ..., - это «многоточие».Знание этого должно облегчить поиск информации о конструкции.Например, первое попадание в Google - это еще один вопрос на этом сайте: Как использовать функцию многоточия R при написании собственной функции?

49 голосов
/ 05 мая 2011

Небольшой пример для начала работы.

f <- function(x, ...)
{
  dots <- list(...)                   #1
  if(length(dots) == 0) return(NULL) 
  cat("The arguments in ... are\n")
  print(dots)
  f(...)                              #2
}

f(1,2,3,"a", list("monkey"))

Функция f хранит все, кроме первого входного аргумента, в переменной многоточия.Для доступа к его содержимому проще всего преобразовать его в список (1).Однако основное использование - для передачи аргументов подфункциям, которые не требуют преобразования (2).

19 голосов
/ 05 мая 2011

Вам следует перейти к разделу «Определение языка R», раздел 2.1.9 Точка-точка-точка . Поставляется в комплекте с установкой R. Запустите help.start() в интерактивном сеансе, чтобы вызвать справку HTML, и нажмите на ссылку Определение языка R . Вы также можете использовать PDF или HTML версию с основного сайта.

В любом случае, ... используется для сопоставления неопределенных формальных аргументов функции.

args(sapply)                                                                                                               
function (X, FUN, ..., simplify = TRUE, USE.NAMES = TRUE)                                                                    
NULL   

sapply(mtcars, mean, trim = .5)                                                                                            
    mpg     cyl    disp      hp    drat      wt    qsec      vs      am    gear                                              
 19.200   6.000 196.300 123.000   3.695   3.325  17.710   0.000   0.000   4.000                                              
   carb                                                                                                                      
  2.000 

Как видите, я передал trim = .5, хотя он не указан в качестве формального аргумента sapply функции.

(обратите внимание, что этот пример тривиален, вы можете использовать sapply(mtcars, median) для достижения того же результата)

...