lettura facile

I cicli nel linguaggio R

In questo tutorial parliamo dei cicli e delle strutture cicliche nel linguaggio R. 

Cos'è un ciclo? Un ciclo è una struttura usata nella programmazione per eseguire ripetutamente un blocco di codice. Ogni passaggio di questo processo ripetitivo è chiamato iterazione. Durante ogni iterazione, il codice all'interno del ciclo viene eseguito. In questo modo puoi gestire compiti ripetitivi in modo efficiente, usando poche righe di codice.

Esistono principalmente due tipi di cicli in R: i cicli for e i cicli while.

Vediamo come funzionano e come possono essere utilizzati in maniera efficace.

Ciclo for

Il ciclo for in R è utilizzato per eseguire un blocco di codice per un numero prestabilito di volte.

  1. for (variabile in sequenza) {
  2. # Codice da eseguire
  3. }

Ad ogni iterazione, la variabile specificata nel ciclo assume il valore corrente della sequenza e viene eseguito il blocco di codice all'interno delle parentesi graffe {}

Una volta che tutti gli elementi della sequenza sono stati attraversati, il ciclo termina.

Ecco un esempio pratico.

Supponi di voler stampare i numeri da 1 a 5:

  1. for (i in 1:5) {
  2. print(i)
  3. }

In questo ciclo for in R, la variabile contatore "i" assume valori da 1 a 5, uno alla volta.

Ad ogni iterazione del ciclo, il valore corrente della variabile "i" viene stampato grazie alla funzione print(i).

Il ciclo si ripete per cinque volte, stampando in sequenza i numeri da 1 a 5.

1
2
3
4
5

Ciclo while

Il ciclo while continua a eseguire un blocco di istruzioni fino a quando una condizione specificata è vera.

  1. while (condizione) {
  2. # Codice da eseguire
  3. }

Il blocco di codice da iterare va messo tra due parentesi graffe e può essere composto da una o più istruzioni.

Ad esempio, per stampare i numeri da 1 a 5 utilizzando un ciclo while puoi scrivere questo codice:

  1. i <- 1
  2. while (i <= 5) {
  3. print(i)
  4. i <- i + 1
  5. }

In questo frammento di codice R, inizialmente viene impostata la variabile "i" con il valore 1.

Il ciclo while continua a eseguire il blocco di codice finché la condizione i <= 5 rimane vera, stampando il valore corrente di i ad ogni iterazione.

Ad ogni passaggio del ciclo, i viene incrementata di 1, e quando i supera 5, il ciclo termina.

1
2
3
4
5

A differenza del ciclo for, il ciclo while ti permette di realizzare sia dei cicli determinati che indeterminati.

Qual è la differenza tra cicli determinati e indeterminati? I cicli determinati eseguono un numero predeterminato di iterazioni, basato su una sequenza o un intervallo definito. Al contrario, i cicli indeterminati, come il ciclo while, eseguono le iterazioni fino a quando una condizione specificata resta vera. In quest'ultimo caso il loro numero di iterazioni non è conosciuto a priori. Quindi, sono esposti al rischio del loop infinito.

Il rischio del loop infinito

Nel caso di un ciclo while potrebbe non esserci un numero predefinito di iterazioni.

Il ciclo continua a iterare fin quando la condizione è vera. Quindi, potrebbe anche non smettere mai ed entrare in un loop infinito.

Ecco un esempio di loop infinito, questo codice itera all'infinito perché la condizione (i>0) è sempre vera, in quanto la variabile "i" ha inizialmente il valore uguale a 1 e viene incrementata in ogni iterazione.

Quindi, la variabile "i" è sempre un numero positivo.

  1. i <- 1
  2. while (i >0) {
  3. print(i)
  4. i <- i + 1
  5. }

Per evitare il rischio dei loop infiniti, ti consiglio di inserire sempre anche una condizione di uscita forzata.

Ad esempio, puoi imporre la fine del ciclo dopo 1000 iterazioni con un messaggio di errore.

  1. i <- 1
  2. while (i >0) {
  3. print(i)
  4. i <- i + 1
  5. # condizione forzata di uscita dopo mille iterazioni
  6. if (i>1000) {
  7. print("errore: loop infinito")
  8. break
  9. }
  10. }

Le istruzioni break e next

Le istruzioni break e next ti permettono di terminare anticipatamente il ciclo.

L'istruzione break

Termina il ciclo prima del tempo e passa alla prima istruzione successiva dopo la struttura ciclica.

Ad esempio, l'esempio precedente termina il ciclo dopo 1000 iterazioni forzandone l'uscita.

  1. i <- 1
  2. while (i >0) {
  3. print(i)
  4. i <- i + 1
  5. if (i>1000) {
  6. print("errore: loop infinito")
  7. break
  8. }
  9. }

L'istruzione next

L'istruzione next termina anticipatamente l'iterazione corrente per passare all'iterazione successiva.

Questa istruzione non termina il ciclo, che continua a iterare, ma soltanto l'iterazione in corso.

Ad esempio, questo ciclo stampa i numeri da 1 a 5 tranne il numero 4.

  1. i <- 1
  2. while (i <=5) {
  3. if (i==4) { next }
  4. print(i)
  5. i <- i + 1
  6. }
  7. }

La quarta iterazione viene interrotta anticipatamente prima di stampare il valore corrente della variabile "i".

Pertanto, il ciclo stampa i numeri da 1 a 5 ad eccezione del numero 4.

1
2
3
5

L'istruzione next è molto utile quando vuoi saltare il resto del codice in un'iterazione specifica e passare direttamente alla successiva.

Consigli per l'uso efficace dei cicli

Per concludere, ti lascio alcuni consigli utili per utilizzare al meglio i cicli nel linguaggio R

  • Evita cicli troppo lunghi I cicli possono diventare molto lenti, soprattutto se il ciclo è molto lungo. Quando possibile, è meglio utilizzare funzioni vettorializzate.
  • Pre-allocare la memoria Se stai utilizzando un ciclo per riempire un vettore o una matrice, è una buona pratica pre-allocare la memoria prima di iniziare il ciclo. Questo può migliorare notevolmente le prestazioni.
  • Usa lapply e sapply Spesso, è possibile sostituire un ciclo for con lapply o sapply, che sono più veloci e scritte in uno stile più funzionale.
  • Utilizza cicli annidati con attenzione I cicli annidati (un ciclo dentro un altro) possono essere utili e comodi, ma possono anche diventare molto complessi e lenti. Quando puoi, valuta alternative più efficienti.

Ricorda, la pratica è l'unico modo per padroneggiare l'uso dei cicli in R. Quindi, non esitare a sperimentare con diversi approcci per vedere cosa funziona meglio per il tuo caso specifico.

 




Se qualcosa non ti è chiaro, scrivi la tua domanda nei commenti.




FacebookTwitterLinkedinLinkedin