Date post: | 29-Nov-2014 |
Category: |
Documents |
Upload: | dave-reaper |
View: | 180 times |
Download: | 0 times |
Programmazione in R
Scrivere un programma in R
Concetto di funzione in R
R è un linguaggio funzionaleTutto 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
Dati di input
Dati di output
Elaborazione
Il numero 36
Il numero 6
Radice quadrata
Due sequenze di DNA
La sottosequenzaIn comune
Allineamento
Pipeline di elaborazioni
Dati di input
Dati di output
Elaborazione
Dati di output
Elaborazione
Elaborazione
L’output di una elaborazione può essere usata come input di un’altra elaborazione… La catena di elaborazioni che si ottiene è detta pipeline (da pipe che significa tubo in inglese)
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
Problema:
Calcolare l’area di un trapezio
Quali sono i dati di input?
Quali sono i dati di output?
AC
B
Esempio 1 individuare i passi elementari
Problema:Calcolare l’area di un trapezio
Input: A, B, COutput: areaPassi elementari:
formula per calcolare l’area del trapezio (chi se la ricorda?)
AC
B
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:
Calcolare l’area di un trapezio
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
AC
B
Esempio 1 individuare i passi elementari
Passi elementari: triangoli <‐ (A‐B)*C/2rettangolo <‐ B*C
areaTrapezio <‐ triangoli + rettangolo
AC
B
Incapsulare il tutto in una funzione R
areaTrapezio <‐ function(A,B,C) {triangoli <‐ (A‐B)*C/2rettangolo <‐ B*C
AT <‐ triangoli + rettangolo
return(AT)}
La sequenza di istruzioni che consente di ottenere il dato di output (area della campana). Costituiscono il cosiddetto “corpo della funzione”
Le variabili che conterranno i dati di input. Sono chiamati anche “parametri di ingresso”
Istruzione che restituisce il dato di output calcolato
Nome della funzione
AC
B
I nomi per le variabili: conviene scegliere nomi che ne ricordano il significato
areaTrapezio <‐ function(baseMaggiore,baseMinore,altezza) {triangoli <‐ (baseMaggiore‐baseMinore)*altezza/2rettangolo <‐ baseMinore*altezza
AT <‐ triangoli + rettangolo
return(AT)}
Anatomia di una funzione
NomeDellaFunzione <‐ function(ARG1,ARG2,ARG2,…) {istruzione nistruzione 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) Nome2) Parametri di input previsti3) Il valore ritornato
Esempi
> areaTrapezio(20,10,3)> a <‐ areaTrapezio(20,10,3)
20 10 3
45
areaTrapezio
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:
Calcolare l’area di una campana
Quali sono i dati di input?
Quali sono i dati di output?
B
AD
C
Scomposizione del problema
B
A
C
DC
B
DA
Sottoproblema 1
Sottoproblema 2
Sottoproblema 3
B/2
Scriviamo la funzione areaCampana
areaCampana <‐ function(A,B,C,D) {raggio <‐ B/2semicerchio <‐ raggio*raggio*3.14/2rettangolo <‐ B*Ctrapezio <‐ areaTrapezio(A,B,D)AC <‐ semicerchio + rettangolo + trapezioreturn(AC)
}
B
AD
C
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 Matematichecos(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 correnteas.POSIXlt(Sys.time())$year+1900
Restituisce il mese correnteas.POSIXlt(Sys.time())$mon+1
Restituisce il giorno correnteas.POSIXlt(Sys.time())$mday
Soluzione 1
EtaInAnni<‐function(A){B<‐as.POSIXlt(Sys.time())$year+1900C<‐B‐Areturn(C)
}
Scrivere una funzione per calcolare il peso ideale, secondo una delle seguenti formule:
Formula di LorenzPeso ideale Uomini = altezza in cm – 100 ‐ (altezza in cm – 150)/4Peso ideale Donne = altezza in cm – 100 ‐ (altezza in cm – 150)/2
Formula di BrocaPeso ideale Maschi = altezza in cm – 100Peso ideale Femmine = altezza in cm – 104
Formula di Wan der VaelPeso ideale Uomini = (altezza in cm ‐ 150) x 0.75 + 50Peso ideale Donne = (altezza in cm ‐ 150) x 0.6 + 50
Formula di BertheanPeso ideale = 0.8 x (altezza in cm – 100) + età/2
Formula di PerraultPeso ideale = Altezza in cm – 100 + età/10 x 0.9
Formula di KeysPeso ideale Uomini = (altezza in m)² x 22.1Peso ideale Donne = (altezza in m)² x 20.6
Formula di TraviaPeso ideale = (1,012 x altezza in cm) – 107.5