Pro smyčku v R s příklady pro seznam a matici
⚡ Chytré shrnutí
Cyklus For v jazyce R spustí blok kódu jednou pro každý prvek sekvence, ať už je tato sekvence vektor, seznam nebo matice. Tento návod iteruje přes každý z nich a ukazuje, kdy je vektorizovaný kód lepší volbou.

A pro smyčku opakuje blok kódu jednou pro každý prvek sekvence. Tato sekvence může být vektor, seznam, datový rámec, matice nebo jakýkoli jiný objekt, který R může iterovat. R rozlišuje velká a malá písmena, takže klíčové slovo je vždy malé. fora složené závorky jsou povinné vždy, když tělo textu přesahuje více než jeden řádek.
Syntaxe cyklu For v R
for (i in vector) { Exp }
Zde,
R zacyklí všechny proměnné ve vektoru a provede výpočet zapsaný uvnitř exp.

Podívejme se na několik příkladů.
Pro smyčku v R Příklad 1: Iterujeme všechny prvky vektoru a vytiskneme aktuální hodnotu.
# Create fruit vector fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana') # Create the for statement for ( i in fruit){ print(i) }
Výstup:
## [1] "Apple" ## [1] "Orange" ## [1] "Passion fruit" ## [1] "Banana"
Pro smyčku v R Příklad 2: umocněte každé celé číslo od 1 do 4 a uložte výsledky do seznamu.
# Create an empty list list <- c() # Create a for statement to populate the list for (i in seq(1, 4, by=1)) { list[[i]] <- i*i } print(list)
Výstup:
## [1] 1 4 9 16
Smyčky for jsou užitečné v práci se strojovým učením. Ladění regularizačního parametru znamená testování mnoha kandidátských hodnot a udržováníping ten, který minimalizuje ztrátovou funkci, a smyčka for je přímočarý způsob, jak tento rozsah projít.
Jak používat break a next ve smyčce For
Dvě klíčová slova přerušují normální sekvenci cyklu for.
- rozbít okamžitě ukončí smyčku a přeskočí všechny zbývající prvky.
- další opustí pouze aktuální prvek a přejde k následujícímu.
fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana') # break: stop at the first match for (i in fruit) { if (i == 'Passion fruit') { print('Found it, stopping here') break } print(i) } # next: skip one element and carry on for (i in fruit) { if (i == 'Orange') next print(i) }
Ve vnořených smyčkách se funkce break a next chovají pouze ve vnitřní smyčce, která je obsahuje. Chcete-li v příkladu s maticí ponechat obě smyčky, nastavte proměnnou flag a otestujte ji také ve vnější smyčce.
Pro indexy použijte seq_along(). Zápis for (i in 1:length(x)) vypadá neškodně, ale selže na prázdném objektu, protože 1:0 vytvoří sekvenci 1, 0 a smyčka se provede dvakrát. seq_along(x) vrátí místo toho prázdnou sekvenci, takže smyčka je správně přeskočena:
for (i in seq_along(fruit)) { cat(i, fruit[i], '\n') }
Smyčka For přes seznam
Toaletaping přes seznam funguje přesně jako na záchoděping nad vektorem, s tím rozdílem, že každý prvek může obsahovat jiný typ:
# Create a list with three vectors fruit <- list(Basket = c('Apple', 'Orange', 'Passion fruit', 'Banana'), Money = c(10, 12, 15), purchase = FALSE) for (p in fruit) { print(p) }
Výstup:
## [1] "Apple" "Orange" "Passion fruit" "Banana" ## [1] 10 12 15 ## [1] FALSE
Smyčka For přes matici
Matice má dva rozměry, řádky a sloupce, takže iterace přes každou buňku vyžaduje dvě vnořené smyčky for: vnější pro řádky a vnitřní pro sloupce.
# Create a matrix mat <- matrix(data = seq(10, 20, by=1), nrow = 6, ncol =2) # Create the loop with r and c to iterate over the matrix for (r in 1:nrow(mat)) for (c in 1:ncol(mat)) print(paste("Row", r, "and column",c, "have values of", mat[r,c]))
Výstup:
## [1] "Row 1 and column 1 have values of 10" ## [1] "Row 1 and column 2 have values of 16" ## [1] "Row 2 and column 1 have values of 11" ## [1] "Row 2 and column 2 have values of 17" ## [1] "Row 3 and column 1 have values of 12" ## [1] "Row 3 and column 2 have values of 18" ## [1] "Row 4 and column 1 have values of 13" ## [1] "Row 4 and column 2 have values of 19" ## [1] "Row 5 and column 1 have values of 14" ## [1] "Row 5 and column 2 have values of 20" ## [1] "Row 6 and column 1 have values of 15" ## [1] "Row 6 and column 2 have values of 10"
Smyčka For přes datový rámec v R
Datový rámec je seznam sloupců, takže prostá smyčka for prochází jeho sloupce, nikoli řádky. To je obvykle to, co chcete:
df <- data.frame(a = 1:5, b = 6:10, c = 11:15) # Loop over the columns for (col in names(df)) { cat(col, 'has mean', mean(df[[col]]), '\n') }
Všimněte si dvojité závorky. df[[col]] extracts sloupec jako vektor, zatímco df[col] vrací datový rámec s jedním sloupcem, který mean() nedokáže zpracovat.
Toaletaping přes řádky. Iterace po řádcích je možná, ale pomalá, protože R kopíruje řádek při každém průchodu:
for (r in seq_len(nrow(df))) { cat('Row', r, 'sums to', sum(df[r, ]), '\n') }
Pro cokoli nad rámec několika tisíc řádků preferujte rowSums(df), apply(df, 1, sum) nebo dplyr. group_by() a summarize() pipeline, které všechny vykonávají stejnou práci bez kopírování.
Smyčky For vs. vektorizace v R
R je vektorizovaný jazyk: většina jeho operátorů a funkcí již v kompilovaném kódu C působí na celé vektory najednou. Explicitní smyčka, která opakuje vektorizovanou operaci prvek po prvku, je delší i pomalejší.
# Loop version squares <- c() for (i in 1:4) { squares[i] <- i * i } # Vectorized version, same result squares <- (1:4)^2
| Úkol | Smyčka | Vektorizovaný ekvivalent |
|---|---|---|
| Aritmetika po elementech | pro každý prvek | x * 2, x + y, x^2 |
| Použití funkce na sloupec | pro nadřazená jména (df) | sapply(df, průměr) |
| Použít funkci na řádek | pro více než seq_len(nrow(df)) | aplikovat(df, 1, součet) |
| Vytvořte seznam výsledků | pro seznam se seznamem[[i]] <- … | lapply(v, f) |
| Podmíněné překódování | pro s if a else | ifelse(podmínka, a, b) |
Když je smyčka stále správnou odpovědí. Smyčku for ponechte, když každá iterace závisí na předchozím výsledku, když voláte externí službu nebo zapisujete soubory, nebo když je u malého objektu srozumitelnější než rychlost.
Pokud musíte smyčku používat, proveďte předalokaci. Zvětšování objektu uvnitř smyčky nutí R jej kopírovat při každém průchodu. Nejprve jej vytvořte v plné velikosti:
# Slow: the vector is reallocated on every pass out <- c() for (i in 1:1000) out[i] <- i^2 # Fast: allocated once out <- numeric(1000) for (i in 1:1000) out[i] <- i^2
Smyčka For v R: Stručný přehled
Všechny konstrukty použité v tomto tutoriálu jsou uvedeny níže:
| Objektivní | Code |
|---|---|
| Smyčka přes vektor |
for (i in v) { print(i) } |
| Bezpečné přepínání indexů |
for (i in seq_along(v)) { print(v[i]) } |
| Smyčka přes seznam |
for (p in my_list) { print(p) } |
| Smyčka přes sloupce datového rámce |
for (col in names(df)) { print(mean(df[[col]])) } |
| Smyčka přes matici |
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c]) |
| Opusťte smyčku dříve |
if (condition) break
|
| Přeskočit jednu iteraci |
if (condition) next
|
| Předběžné přidělení výstupu |
out <- numeric(n) |
