For petlja u R s primjerima za listu i matricu
⚡ Pametni sažetak
Petlja For u R-u pokreće blok koda jednom za svaki element niza, bez obzira je li taj niz vektor, lista ili matrica. Ovaj vodič iterira kroz svaki od njih i pokazuje kada je vektorizirani kod bolji izbor.

A za petlju ponavlja blok koda jednom za svaki element niza. Taj niz može biti vektor, lista, okvir podataka, matrica ili bilo koji drugi objekt kroz koji R može iterirati. R razlikuje velika i mala slova, pa je ključna riječ uvijek mala. za, a vitičaste zagrade su potrebne kad god se tijelo naredbe proteže preko više od jednog retka.
Sintaksa petlje For u R-u
for (i in vector) { Exp }
Ovdje,
R preći će sve varijable u vektoru i izvršiti izračun napisan unutar exp.

Pogledajmo nekoliko primjera.
For petlja u R primjeru 1: Iteriramo po svim elementima vektora i ispisujemo trenutnu vrijednost.
# Create fruit vector fruit <- c('Apple', 'Orange', 'Passion fruit', 'Banana') # Create the for statement for ( i in fruit){ print(i) }
Izlaz:
## [1] "Apple" ## [1] "Orange" ## [1] "Passion fruit" ## [1] "Banana"
For petlja u R primjeru 2: kvadrirajte svaki cijeli broj od 1 do 4 i pohranite rezultate u listu.
# 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)
Izlaz:
## [1] 1 4 9 16
Petlje for su korisne u strojnom učenju. Podešavanje parametra regularizacije znači testiranje mnogih kandidatskih vrijednosti i održavanjeping onaj koji minimizira funkciju gubitka, a for petlja je jednostavan način za popisivanje tog raspona.
Kako koristiti break i next u For petlji
Dvije ključne riječi prekidaju normalan slijed for petlje.
- razbiti odmah izlazi iz petlje i preskače svaki preostali element.
- sljedeći napušta samo trenutni element i prelazi na sljedeći.
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) }
U ugniježđenim petljama, break i next djeluju samo na najunutarnju petlju koja ih sadrži. Da biste obje petlje ostavili u primjeru matrice, postavite varijablu zastavice i testirajte je i u vanjskoj petlji.
Za indekse koristite seq_along(). Pisanje for (i u 1:length(x)) izgleda bezopasno, ali ne uspijeva na praznom objektu, jer 1:0 proizvodi niz 1, 0 i petlja se izvršava dva puta. seq_along(x) vraća prazan niz, pa je petlja ispravno preskočena:
for (i in seq_along(fruit)) { cat(i, fruit[i], '\n') }
Petlja For preko liste
WCping preko popisa funkcionira točno kao WCping nad vektorom, osim što svaki element može sadržavati različit tip:
# 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) }
Izlaz:
## [1] "Apple" "Orange" "Passion fruit" "Banana" ## [1] 10 12 15 ## [1] FALSE
Petlja For preko matrice
Matrica ima dvije dimenzije, retke i stupce, pa iteracija kroz svaku ćeliju zahtijeva dvije ugniježđene for petlje: vanjsku za retke i unutarnju za stupce.
# 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]))
Izlaz:
## [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"
Petlja For preko okvira podataka u R-u
Okvir podataka je popis stupaca, pa obična for petlja prolazi kroz njegove stupce, a ne kroz retke. To je obično ono što želite:
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') }
Obratite pažnju na dvostruku zagradu. df[[col]] extracts stupac kao vektor, dok df[col] vraća okvir podataka s jednim stupcem koji mean() ne može obraditi.
WCping preko redova. Iteracija po redovima je moguća, ali spora, jer R kopira red u svakom prolazu:
for (r in seq_len(nrow(df))) { cat('Row', r, 'sums to', sum(df[r, ]), '\n') }
Za sve što prelazi nekoliko tisuća redaka, preferirajte rowSums(df), apply(df, 1, sum) ili dplyr. group_by() i summary() cjevovod, koji svi obavljaju isti posao bez kopiranja.
For petlje u odnosu na vektorizaciju u R-u
R je vektorizirani jezik: većina njegovih operatora i funkcija već djeluje na cijele vektore odjednom, u kompiliranom C kodu. Eksplicitna petlja koja ponavlja vektoriziranu operaciju element po element je i dulja i sporija.
# Loop version squares <- c() for (i in 1:4) { squares[i] <- i * i } # Vectorized version, same result squares <- (1:4)^2
| Zadatak | Petlja | Vektorizirani ekvivalent |
|---|---|---|
| Aritmetika po elementima | za preko svakog elementa | x * 2, x + y, x^2 |
| Primijenite funkciju po stupcu | za preko imena (df) | sapply(df, srednja vrijednost) |
| Primijeni funkciju po retku | za preko seq_len(nrow(df)) | primijeni(df, 1, zbroj) |
| Izradi popis rezultata | za s popisom[[i]] <- … | preklapanje(v, f) |
| Uvjetno prekodiranje | za s ako i inače | ako(uvjet, a, b) |
Kada je petlja još uvijek točan odgovor. Zadržite petlju for kada svaka iteracija ovisi o prethodnom rezultatu, kada pozivate vanjski servis ili pišete datoteke ili kada je jasnoća važnija od brzine na malom objektu.
Ako morate koristiti petlju, unaprijed dodijelite. Povećanje objekta unutar petlje prisiljava R da ga kopira u svakom prolazu. Prvo ga stvorite u punoj veličini:
# 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
Petlja For u R-u: Kratki pregled
Svaka konstrukcija korištena u ovom tutorijalu navedena je u nastavku:
| Cilj | Code |
|---|---|
| Petlja preko vektora |
for (i in v) { print(i) } |
| Sigurno prelaženje preko indeksa u petlji |
for (i in seq_along(v)) { print(v[i]) } |
| Petlja preko popisa |
for (p in my_list) { print(p) } |
| Petlja preko stupaca okvira podataka |
for (col in names(df)) { print(mean(df[[col]])) } |
| Petlja preko matrice |
for (r in 1:nrow(m)) for (c in 1:ncol(m)) print(m[r, c]) |
| Izađite iz petlje ranije |
if (condition) break
|
| Preskoči jednu iteraciju |
if (condition) next
|
| Prethodno dodijelite izlaz |
out <- numeric(n) |
