Autor článku: Lenka Fiřtová

V tomto článku je popsán způsob, jak zařídit, aby R provedlo tutéž operaci několikrát za sebou, čili jak použít tzv. cyklus. Cykly slouží k ušetření času ve chvíli, kdy chceme provést stejnou operaci opakovaně.

Příklad 1

Příkaz sample(20) vytvoří náhodně seřazenou řadu čísel od 1 do 20. Vytvořte si takovou řadu s názvem y. Pak pomocí for cyklu nahraďte všechna jednociferná čísla v této řadě číslem o 20 větším (měli byste tedy ve výsledku dostat řadu čísel od 10 do 29).

Nejprve si vytvoříme popsanou řadu y a podíváme se, jak vypadá. Protože jde o náhodně seřazená čísla, vaše konkrétní řada bude pravděpodobně vypadat trochu jinak.

> y = sample(20)
> y
  [1] 16 11 18 17 10 19 2 12 20 14 8 6 15 4 13 9 7 3 5 1

Nyní použijeme for cyklus, který bude vypadat následovně:

> for(i in 1:20) {
       if(y[i]<10 {
             y[i] = y[i] + 20
       }
   }

Tento cyklus postupně prochází jedno číslo po druhém v řadě y a kontroluje, jestli je dané číslo jednociferné (menší než 10). Pokud ano, nahradí ho číslem o 20 větším.

V úvodu for cyklu je příkaz for(i in 1:20). Tento příkaz říká R-ku, kolikrát chceme cyklus provést. My zde konkrétně specifikujeme, že chceme cyklus provést dvacetkrát, a to pro i od jedné do dvaceti (1 : 20), přičemž i si můžeme představit jako „pomocnou“ proměnnou, která postupně nabývá hodnoty od 1 do 20. Místo písmena i lze použít jakýkoli zatím nevyužitý název proměnné (písmeno, slovo apod.).

V kudrnatých závorkách je specifikována požadovaná operace.

V prvním běhu cyklu je proměnná i nastavena na hodnotu 1. Následně proběhne operace, která je obsažena uvnitř cyklu. Ta bude pro i = 1 vypadat následovně:

> if(y[1]<10) {
        y[1] = y[1]+20  

Jedná se o if podmínku, která ověří, jestli první číslo řady (y[1]) je menší než 10, a pokud ano, zvětší jej o 20.

Jakmile proběhne první cyklus, přenastaví se i na hodnotu dva a proces se opakuje až do chvíle, kdy i rovná se 20.  

Podrobnější vysvětlení k podmínkám najdete zde.

Podrobnější vysvětlení k vektorům (řadám čísel) najdete zde.

Výsledný vektor po proběhnutí cyklu vypadá následovně:

> y
  [1] 16 11 18 17 10 19 22 12 20 14 28 26 15 24 13 29 27 23 25 21

Příklad 2

For cykly můžeme libovolně vnořovat do sebe. Ukažme si to na následujícím příkladu. Založíme si prázdnou proměnnou z.

> z = NULL

Do této proměnné postupně uložíme pro čísla 1, 2, 3, 4 a 5 jejich druhou, třetí a čtvrtou mocninu. Postupovat můžeme takto:

> for(i in 1:5) {
      for(j in 2:4)  {
             z = c(z, i^i)
      }
  }
z

Protože používáme dva for cykly, musíme mít dvě „pomocné“ proměnné, například i a j (pozor, každý for cyklus musí mít svoji vlastní).

První for cyklus říká, že pro i od jedné do pěti chceme provést určitou operaci. Druhý, vnořený for cyklus říká, že chceme provést určitou operaci pro j od dvou do čtyř (povšimněte si, že for cyklus není nutné zahajovat jedničkou).

Příkaz z = c(z, i^j) říká, že k proměnné chceme „přilepit“ v daném běhu cyklu další číslo, a to konkrétně číslo i umocněné na číslo j.

Nejprve se tedy proměnná i nastaví na hodnotu 1 a tato jednička se postupně umocní na druhou, na třetí a na čtvrtou (tedy pro i =1 proběhne celý vnořený for cyklus). Následně se proměnná i nastaví na hodnotu 2 a tato dvojka se opět postupně umocní na druhou, na třetí a na čtvrtou. Totéž se pak zopakuje pro i rovno třem, čtyřem a pěti.

Výsledný vektor má tedy následující podobu:

> z
[1] 1  1  1  4  8  16  9  27  81  16  64  256  25  125  625

Na závěr je podstatné zmínit, že „pomocné“ proměnné mohou mít, jak vyplynulo z těchto příkladů, několik funkcí. Nabývají-li hodnoty počínaje jedničkou (např. viz výše i = 1 : 5), pak pomyslně označují, kolikátá smyčka cyklu probíhá. Lze ale stejně dobře využívat jejich konkrétní hodnoty (například ve chvíli, kdy má proměnná j hodnotu 3, můžeme s ní pracovat úplně stejně jako s číslem 3). A v neposlední řadě je lze využívat jako indexy, tedy k určení pořadí nějakého prvku (například pro i = 2 by y[i] vyfiltrovalo druhý prvek v pořadí ve vektoru y).