10.4 Výběr a úpravy prvků vektorů
Často potřebujeme ze složitější struktury získat jeden její prvek. Obecně k tomu slouží funkce [[
(dvojité hranaté závorky). Funkce pluck(.x, ..., .default = NULL)
tuto myšlenku zobecňuje. Umožňuje vybrat libovolně zanořený prvek vektoru .x
. Ukážeme si to na příkladu vektoru hráčů:
## List of 2
## $ :List of 3
## ..$ id : num 11
## ..$ name : chr "Karel"
## ..$ items:List of 2
## .. ..$ : chr "sword"
## .. ..$ : chr "key"
## $ :List of 3
## ..$ id : num 12
## ..$ name : chr "Emma"
## ..$ items:List of 3
## .. ..$ : chr "mirror"
## .. ..$ : chr "potion"
## .. ..$ : chr "dagger"
První parametr pluck()
je vektor, ze kterého vybíráme. Další parametry jsou pozice nebo jména prvků, které vybíráme. Pokud zadáme víc položek, pak výběr funguje rekurzivně: druhá položka vybírá z výsledku prvního výběru atd.:
## $id
## [1] 11
##
## $name
## [1] "Karel"
##
## $items
## $items[[1]]
## [1] "sword"
##
## $items[[2]]
## [1] "key"
## [1] "Karel"
## [[1]]
## [1] "sword"
##
## [[2]]
## [1] "key"
## [1] "sword"
K výběru můžeme použít i funkci, která vrací výběr z vektoru:
artefact <- function(x) x[["items"]] # funkce vrací artefakty vybraného hráče
artefact(dungeon[[1]]) # seznam všech artefaktů prvního hráče
## [[1]]
## [1] "sword"
##
## [[2]]
## [1] "key"
## [1] "sword"
Všechny tyto výběry můžeme samozřejmě provést i pomocí základních funkcí R, syntaxe pluck()
je však přehlednější. Poslední výběr bychom např. museli zadat takto:
## [1] "sword"
Pokud hledaný prvek ve vektoru neexistuje, funkce pluck()
vrátí NULL
. Tuto hodnotu můžeme změnit pomocí parametru .default
:
## NULL
## [1] NA
Pokud bychom potřebovali, aby funkce raději zhavarovala, můžeme místo pluck()
použít funkci chuck(x, ...)
:
## Error: Index 1 exceeds the length of plucked object (3 > 2)
Funkce pluck()
umožňuje i měnit hodnotu vybraného prvku (zde bohužel není možné při výběru použít funkci jako je např. naše funkce artefact()
):
## List of 2
## $ :List of 3
## ..$ id : num 11
## ..$ name : chr "Karel"
## ..$ items:List of 2
## .. ..$ : chr "megaweapon"
## .. ..$ : chr "key"
## $ :List of 3
## ..$ id : num 12
## ..$ name : chr "Emma"
## ..$ items:List of 3
## .. ..$ : chr "mirror"
## .. ..$ : chr "potion"
## .. ..$ : chr "dagger"
První hráč má nyní místo meče nějakou “megazbraň”.
Pokud potřebujete změnit nějaký prvek vektoru, můžete použít funkce assign_in()
a modify_in()
. Na jejich použití se podívejte do dokumentace.