Sei sulla pagina 1di 26

Programmazione in R

Scrivere un programma in R
Concetto di funzione in R

R è un linguaggio funzionale
Tutto si esprime attraverso una funzione

Scrivere un programma significa scrivere una 
funzione
Una funzione (function) è l’implementazione di un 
algoritmo a cui è stato dato un nome
Eseguire una funzione significa eseguire le 
istruzioni in essa contenute
Modello di programmazione in R

Due sequenze 
Dati di input Il numero 36 di DNA

Elaborazione Radice quadrata Allineamento

La sottosequenza
Dati di output Il numero 6 In comune
Pipeline di elaborazioni

Dati di input L’output di una elaborazione può 
essere usata come input di 
un’altra elaborazione… La catena 
Elaborazione di elaborazioni che si ottiene è 
detta pipeline (da pipe che 
significa tubo in inglese)
Dati di output

Elaborazione

Dati di output

Elaborazione
Scrivere un nuovo programma 
partendo da un problema

Individuare quali sono i dati di input

Individuare quali sono i dati di output

Individuare i passi elementari (istruzioni)
Le istruzioni, tra quelle disponibili nel linguaggio che si 
vuole usare (es. R), per ottenere i dati di output a 
partire dai dati di input
Esempio 1

B
Problema:
C
Calcolare l’area di un trapezio A

Quali sono i dati di input?

Quali sono i dati di output? 
Esempio 1 
individuare i passi elementari

Problema: B

C
Calcolare l’area di un trapezio A

Input: A, B, C
Output: area
Passi elementari: 
formula per calcolare l’area del trapezio 
(chi se la ricorda?) 
Un approccio per risolvere 
problemi complessi

Conosciuto nell’antichità come
Divide et impera

Un problema complesso può essere risolto 
scomponendolo in sottoproblemi più
semplici
Esempio 1 
individuare i passi elementari

Problema: B

C
Calcolare l’area di un trapezio A

Input: A, B, C
Output: area
Passi elementari: 
L’area del trapezio può essere calcolata sommando le aree di figure 
più semplici: i due triangoli ai lati e il rettangolo centrale
Esempio 1 
individuare i passi elementari

B
Passi elementari: 
triangoli <‐ (A‐B)*C/2 C
A
rettangolo <‐ B*C

areaTrapezio <‐ triangoli + rettangolo


Incapsulare il tutto in una funzione R
Le variabili che conterranno i dati di input. Sono 
chiamati anche “parametri di ingresso”
Nome della funzione B
areaTrapezio <‐ function(A,B,C) { C
triangoli <‐ (A‐B)*C/2 A

rettangolo <‐ B*C

AT <‐ triangoli + rettangolo

return(AT) La sequenza di istruzioni che 
} Istruzione che restituisce il 
consente di ottenere il dato di 
output (area della campana). 
dato di output calcolato
Costituiscono il cosiddetto “corpo 
della funzione”
I nomi per le variabili: 
conviene scegliere nomi che ne ricordano il significato

areaTrapezio <‐ function(baseMaggiore,baseMinore,altezza) {


triangoli <‐ (baseMaggiore‐baseMinore)*altezza/2
rettangolo <‐ baseMinore*altezza

AT <‐ triangoli + rettangolo

return(AT)
}
Anatomia di una funzione

NomeDellaFunzione <‐ function(ARG1,ARG2,ARG2,…) {


istruzione n
istruzione n

istruzione n

VariabileDiRitorno <‐ <espr>

return(VariabileDiRitorno)
} Il corpo di una funzione è costituito da una 
parte centrale che esegue l’algoritmo ed un 
epilogo finale che prepara il risultato in una 
variabile che verrà restituita attraverso 
l’istruzione return()
Perché incapsulare in una 
funzione?

Per dare un nome all’algoritmo che risolve il 
problema e richiamarlo ogni volta che ci occorre 
senza dover riscrivere le istruzioni

Le funzioni favoriscono il cosiddetto “riuso del 
codice” e la programmazione “modulare”
(Divide et Impera). Algoritmi già risolti possono 
essere sfruttati senza doverli riscrivere di nuovo 
(come vedremo tra poco)
Come si usa una funzione

Semplicemente scrivendo il nome della funzione 
fornendogli i dati di input

Per usare una funzione bisogna conoscere la “signature”:
1) Nome
2) Parametri di input previsti
3) Il valore ritornato 20  10  3

Esempi
areaTrapezio
> areaTrapezio(20,10,3)
> a <‐ areaTrapezio(20,10,3)
45
Come si usa una funzione

In realtà l’invocazione di una funzione 
diventa un’istruzione che R valuta come se 
fosse una espressione

Quindi l’invocazione di funzione può essere 
parte di una espressione (aritmetica, ma 
come vedremo in seguito non solo)
Esempi

Cosa succede se…

> areaTrapezio(20,10,3) + 5
> a <‐ 10
> b <‐ 2*areaTrapezio(20,10,3) + a

> areaTrapezio(a,10,3)
> areaTrapezio(20,10,3+a)
> areaTrapezio(areaTrapezio(2,1,1),10,3)

> c <‐ areaTrapezio(2,1,1)
> areaTrapezio(c,10,3)

… anche gli argomenti di input della funzione possono essere il risultato di un 
espressione
Esempio 2

Problema:
C
Calcolare l’area di una campana B
D
A

Quali sono i dati di input?

Quali sono i dati di output? 
Scomposizione del problema

Sottoproblema 1
B/2

C Sottoproblema 2
B
C
B
D
A

D
Sottoproblema 3
A
Scriviamo la funzione areaCampana

areaCampana <‐ function(A,B,C,D) {


raggio <‐ B/2
semicerchio <‐ raggio*raggio*3.14/2 C
B
rettangolo <‐ B*C
D
trapezio <‐ areaTrapezio(A,B,D) A

AC <‐ semicerchio + rettangolo + trapezio
return(AC)
}
Le funzioni di R

R fornisce un insieme di funzioni preinstallate

Ognuno può contribuire ad arricchire il repertorio di 
funzioni di R scrivendone di nuove e mettendole a 
disposizione dei programmatori e/o utilizzatori

In R le funzioni sono organizzate in package

Es. Bioconductor è un insieme di package per la 
bioinformatica
Alcune funzioni di R già realizzate e 
pronte all’uso

Funzioni Matematiche
cos(x) 
sin(x) 
tan(x) 
acos(x) 
asin(x) 
atan(x) 
log10(x)
logb(x,b)
sqrt(x)
Esercizi

> A <‐ 3 * sqrt(2*2)
> A <‐ A + sqrt(sin())
> A <‐ 3 * sqrt(2*2)
Esercizi

Scrivere una funzione etaInAnni(X) che prende come input l’anno di nascita 
di una persona e restituisce la sua età in anni.

Scrivere una funzione etaInGiorni(X) che prende come input la data di 
nascita di una persona (giorno, mese e anno) e restituisce la sua età in giorni 
(assumere che i giorni in un anno sia 360 e quelli in un mese 30, trascurando 
la presenza di anni bisestili e mesi di 31 e 28 giorni).
Note:
Per entrambi gli esercizi è necessario leggere la data corrente. Tale informazione è disponibile in quanto un calcolatore 
possiede un orologio di sistema. Le istruzioni per leggere le informazioni provenienti dall’orologio di sistema sono le 
seguenti:

Restituisce l’anno corrente
as.POSIXlt(Sys.time())$year+1900

Restituisce il mese corrente
as.POSIXlt(Sys.time())$mon+1

Restituisce il giorno corrente
as.POSIXlt(Sys.time())$mday
Soluzione 1

EtaInAnni<‐function(A){
B<‐as.POSIXlt(Sys.time())$year+1900
C<‐B‐A
return(C) 
}
Scrivere una funzione per calcolare il peso 
ideale, secondo una delle seguenti formule:
Formula di Lorenz
Peso ideale Uomini = altezza in cm – 100 ‐ (altezza in cm – 150)/4
Peso ideale Donne = altezza in cm – 100 ‐ (altezza in cm – 150)/2
Formula di Broca
Peso ideale Maschi = altezza in cm – 100
Peso ideale Femmine = altezza in cm – 104
Formula di Wan der Vael
Peso ideale Uomini = (altezza in cm ‐ 150) x 0.75 + 50
Peso ideale Donne = (altezza in cm ‐ 150) x 0.6 + 50
Formula di Berthean
Peso ideale = 0.8 x (altezza in cm – 100) + età/2
Formula di Perrault
Peso ideale = Altezza in cm – 100 + età/10 x 0.9
Formula di Keys
Peso ideale Uomini = (altezza in m)² x 22.1
Peso ideale Donne = (altezza in m)² x 20.6
Formula di Travia
Peso ideale = (1,012 x altezza in cm) – 107.5