
Cyklus for
Cyklus for již znáte z kapitoly Příkazy cyklů. Připomeňme si, že se používá v případě, kdy potřebujeme zopakovat sérii příkazů mnohokrát za sebou. Základní forma je for (promenna in vyraz) {prikazy}.
Proměnnou (v příkladě níže je to i) můžeme během for cyklu upravovat, cyklus to neovlivní, protože v každé iteraci dojde k znovunačtení hodnoty proměnné i podle pořadí cyklu:
> for(i in 1:10) {print(i^2)}
[1] 1
[1] 4
[1] 9
[1] 16
[1] 25
[1] 36
[1] 49
[1] 64
[1] 81
[1] 100
Vektor hodnot, kterých nabývá proměnná při jednotlivých iteracích cyklu může být definován přímo jako vektor nebo jako objekt:
> x <- c()
> for (i in 1:10) {x<-c(x,i^2)}
> x
[1] 1 4 9 16 25 36 49 64 81 100
je to samé jako:
> x <- c()
> a <- 1:10
> for (i in a) {x<-c(x,i^2)}
Pozor! Častou chybou je záměna objektu, který je vektorem o více elementech za objekt, který je pouze číslem (a je vektor, proto nemůžeme definovat iteraci i přes 1:a :
> x <- c()
> a <- 1:10
> for (i in 1:a) {x<-c(x,i^2)} Warning message:
In 1:a : numerical expression has 10 elements: only the first used
Další chybou bývá iterace do nuly, když není známá délka vektoru a odkazujeme se na ní jako length(a), ale vektor a je prázdný:
> x <- c()
> a <- c()
> for (i in 1:length(a)) {x<-c(x,a[i]^2)}
> x
[1] 1 0
Pokud je možné, že bude mít objekt délku 0, je vhodnější místo 1:length(a) použít k vytvoření vektoru pro iterace funkci seq_along(a), která v případě nulové délky a vrátí prázdný vektor a iterace se neprovede:
> x <- c()
> for (i in seq_along(a)) {x<-c(x,i^2)}
> x
NULL
Pozor na iterace s negativními čísly - je to možné, ale proměnná i nesmí být použita pro indexaci prvků vektoru:
> a <- seq(-10,1,by=1)
> x <- c()
> for (i in a) {x[i]<-i^2}
> x
[1] 1
Znovu zde lze použít seq_along():
> a <- seq(-10,1,by=1)
> x <- c()
> for (i in seq_along(a)) {x[i]<-i^2}
> x
[1] 1 4 9 16 25 36 49 64 81 100 121 144
Pozor na indexování od nuly – výpočet proběhne, ale index 0 se nedosadí, neboť neexistuje:
> x <- c()
> for (i in 0:9) {x[i]<-i^2}
> x
[1] 1 4 9 16 25 36 49 64 81