Download - INF11 Scrivere Una Funzione
![Page 1: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/1.jpg)
Programmazione in R
Scrivere un programma in R
![Page 2: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/2.jpg)
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
![Page 3: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/3.jpg)
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
![Page 4: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/4.jpg)
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)
![Page 5: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/5.jpg)
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
![Page 6: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/6.jpg)
Esempio 1
Problema:
Calcolare l’area di un trapezio
Quali sono i dati di input?
Quali sono i dati di output?
AC
B
![Page 7: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/7.jpg)
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
![Page 8: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/8.jpg)
Un approccio per risolvere problemi complessi
Conosciuto nell’antichità come
Divide et impera
Un problema complesso può essere risolto scomponendolo in sottoproblemi piùsemplici
![Page 9: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/9.jpg)
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
![Page 10: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/10.jpg)
Esempio 1 individuare i passi elementari
Passi elementari: triangoli <‐ (A‐B)*C/2rettangolo <‐ B*C
areaTrapezio <‐ triangoli + rettangolo
AC
B
![Page 11: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/11.jpg)
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
![Page 12: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/12.jpg)
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)}
![Page 13: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/13.jpg)
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()
![Page 14: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/14.jpg)
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)
![Page 15: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/15.jpg)
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
![Page 16: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/16.jpg)
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)
![Page 17: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/17.jpg)
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
![Page 18: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/18.jpg)
Esempio 2
Problema:
Calcolare l’area di una campana
Quali sono i dati di input?
Quali sono i dati di output?
B
AD
C
![Page 19: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/19.jpg)
Scomposizione del problema
B
A
C
DC
B
DA
Sottoproblema 1
Sottoproblema 2
Sottoproblema 3
B/2
![Page 20: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/20.jpg)
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
![Page 21: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/21.jpg)
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
![Page 22: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/22.jpg)
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)
![Page 23: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/23.jpg)
Esercizi
> A <‐ 3 * sqrt(2*2)> A <‐ A + sqrt(sin())> A <‐ 3 * sqrt(2*2)
![Page 24: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/24.jpg)
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
![Page 25: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/25.jpg)
Soluzione 1
EtaInAnni<‐function(A){B<‐as.POSIXlt(Sys.time())$year+1900C<‐B‐Areturn(C)
}
![Page 26: INF11 Scrivere Una Funzione](https://reader034.vdocuments.pub/reader034/viewer/2022051609/547aba94b479595e098b4b47/html5/thumbnails/26.jpg)
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