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, recycle0 = FALSE)
## .Internal(paste(list(...), sep, collapse, recycle0))
## <bytecode: 0x5580f7082b98>
## <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ů:
<- function(...) {
count_all_members <- list(...)
param 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: 0x5580f8b5e5d0>
## <environment: namespace:base>
(O objektech a metodach se dozvite vice v kapitole 9.)