Slovník | Vyhledávání | Mapa webu
 
Základy informatiky pro biologyAnalýza dat v R Rozšířené základy R R jako programovací jazyk Cykly a podmínky

Logo Matematická biologie

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

 

 
vytvořil Institut biostatistiky a analýz Lékařské fakulty Masarykovy univerzity