5.5 Speciální argument ...

Kromě explicitně vyjmenovaných parametrů může mít funkce v R i speciální parametr .... Tento parametr absorbuje libovolný počet parametrů na dané pozici; všechny parametry uvedené za ním musejí být volány plným jménem.

Parametr ... se používá zejména ve dvou situacích: 1) když počet parametrů není dopředu znám a 2) když chceme některé parametry předat z naší funkce další funkci, kterou naše funkce volá.

Funkce paste() spojuje libovolný počet řetězců (bud spojuje vektory po prvcích, nebo kolabuje vektor do jednoho řetězce). Počet parametrů není znám dopředu, proto funkce paste používá parametr ...:

paste("Ahoj,", "lidi.", "Jak se máte?")
## [1] "Ahoj, lidi. Jak se máte?"
paste
## function (..., sep = " ", collapse = NULL) 
## .Internal(paste(list(...), sep, collapse))
## <bytecode: 0x563419f40778>
## <environment: namespace:base>

Funkce print() dokáže vypsat do konzoly obsah mnoha různých objektů – pro každý objekt volá speciální funkci přizpůsobenou tomuto objektu. Proto je třeba mít možnost funkci print() předat libovolné parametry, které funkce print() předá dál:

print
## function (x, ...) 
## UseMethod("print")
## <bytecode: 0x56341c1984e0>
## <environment: namespace:base>

Pokud chcete napsat vlastní funkci s libovolným počtem parametrů, můžete použít následující trik: parametr ... se vloží do seznamu, s jehož prvky se pak už pracuje obvyklým způsobem. Vytvoříme funkci, která vezme libovolný počet atomických vektorů a vrátí součet počtu prvků všech těchto vektorů:

count_all_members <- function(...) {
    param <- list(...)
    num <- sum(sapply(param, length))
    num
}
count_all_members(1)
## [1] 1
count_all_members(1, 1:10, 1:100, 1:1000)
## [1] 1111

(Co přesně dělá funkce sapply() vysvětlíme později.)