8.4 Speciální parametr ...

Kromě explicitně vyjmenovaných parametrů může funkce v R obsahovat i speciální parametr tři tečky (...). Tento parametr absorbuje libovolný počet parametrů na dané pozici; všechny parametry uvedené za ním musejí být tedy 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á. Příkladem funkce, která bere libovolný počet vstupních parametrů, je funkce paste(), která umožňuje spojit libovolný počet řetězců: buď 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: 0x5626ac62f780>
## <environment: namespace:base>

Pokud chcete napsat vlastní funkci s libovolným počtem parametrů, můžete použít následující trik: parametr ... vložíme do seznamu, s jehož prvky pak už pracujeme obvyklým způsobem. Jako příklad použití ... 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(...)
    sum(purrr::map_int(param, length))
}
count_all_members(1)
## [1] 1
count_all_members(1, 1:10, 1:100, 1:1000)
## [1] 1111

(Co presne dela funkce map_int() z baliku **purrr*, vysvetlime v kapitole 10.)

Příkladem funkce, která předává svoje parametry dál, je funkce print(), která dokáže vypsat do konzoly obsah mnoha různých objektů – pro každý objekt volá speciální metodu, tj. 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 zvolené metodě:

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

(O objektech a metodach se dozvite vice v kapitole 9.)