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 ...
:
## [1] "Ahoj, lidi. Jak se máte?"
## 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
## [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ě:
## function (x, ...)
## UseMethod("print")
## <bytecode: 0x5626ace9ee78>
## <environment: namespace:base>
(O objektech a metodach se dozvite vice v kapitole 9.)