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.

  • 🔁 Základní syntaxe: for (i in vector) { expression } přiřadí každý prvek k i a spustí tělo vektoru.
  • ???? Libovolný objekt: Stejná syntaxe prochází vektor, seznam, sadu sloupců datového rámce nebo řádky matice.
  • 🧮 Vnořené smyčky: Matice potřebuje dvě smyčky, vnější pro řádky a vnitřní pro sloupce.
  • 🛑 Řízení toku: Příkaz break zcela opustí smyčku a příkaz next přeskočí pouze aktuální prvek.
  • Vektorizace jako první: Vestavěné vektorizované operace a rodina operací apply jsou rychlejší a kratší než explicitní smyčka.
  • ⚠️ Bezpečné sekvence: Použijte seq_along(x) místo 1:length(x), což se chová špatně, když je objekt prázdný.

Smyčka For v matici seznamu R

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.

Pro Loop v R
Pro Loop v R

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)

Nejčastější dotazy

Pokud je x prázdné, 1:length(x) vrátí posloupnost 1, 0 a smyčka se dvakrát spustí na neexistujících prvcích. seq_along(x) vrátí prázdnou posloupnost, takže smyčka je správně přeskočena.

Problém není v samotné smyčce. Problém je v jejím zvětšování, protože R kopíruje celý objekt při každém průchodu. Předalokujte výsledek nebo použijte vektorizovanou funkci a mezera do značné míry zmizí.

Sloupce. Datový rámec je seznam sloupců, takže každá iterace vám předá jeden celý sloupec. Pokud potřebujete procházet řádky, použijte explicitně seq_len(nrow(df)).

Smyčky for řídí hyperparametrické procházení, křížové validace a trénovací epochy. Každá z nich má známý počet iterací, což je přesně to, k čemu je konstrukce for navržena.

Ano. Asistenti umělé inteligence dokáží převést většinu elementárních smyček na vektorizované nebo ekvivalenty v rámci rodiny aplikací. Před nahrazením originálu porovnejte výstup obou verzí pomocí identique().

Shrňte tento příspěvek takto: