R. Usi per la scuola di base (altri usi)
Nel programma i comandi appaiono preceduti da >.
Le righe seguenti, scritte in nero (con eventuali parti in rosso), possono man mano essere copiate da qui e incollate in R. Il programma automaticamente le esegue.
Le cose scritte in blu sono le uscite od altri commenti.
I grafici, qui riprodotti, in R appaiono in altre finestre.
# Si possono copiare le righe di comandi come le seguenti
# (fino alla prima riga in blu esclusa) e poi incollarle
# (azionando il comando col mouse o con Crtl+V) in R;
# le parti precedute da # vengono prese come commenti.
5/7
[1] 0.7142857
#
# Il significato di [1] lo capiremo fra poco; si possono eseguire
# più comandi, separati da un "punto e virgola", ossia da un ;
# Si ottengono, uno sotto l'altro, i risultati.
5+7; 5-7; 5*7; 50+7; 50-7; 50*7; 100/2; 5/7; 50/7; 1+2+50
[1] 12
[1] -2
[1] 35
[1] 57
[1] 43
[1] 350
[1] 50
[1] 0.7142857
[1] 7.142857
[1] 53
# La parte frazionaria e la parte intera di un numero vengono separate
# da ".", non da ",". Così si fa in quasi tutto il mondo (e in genere
# si fa in "matematica", anche in Italia). La moltiplicazione viene
# indicata col simbolo *.
#
17000*100; 17000*1000
[1] 1700000
[1] 1.7e+07
# Numeri lunghi, come il risultato 17000000 (6 "zero") di 17000*1000
# non vengono scritti per esteso ma in "notazione esponenziale": la
# scrittura 1.7e+07 indica il numero 1.7*10^7.
#
3^2; 2^3; 5^2
[1] 9
[1] 8
[1] 25
# Il simbolo "^" indica l'elevamento alla potenza;  quindi 2^3 e 5^2
# stanno per 2 alla terza e 5 al quadrato.
#
# Un altro esempio di uso della notazione esponenziale:
1/1000; 1/10000
[1] 0.001
[1] 1e-04
# 1/10000 equivale a 1/10^4, che viene scritto anche 1*(10^-4). Anche
# se l'esponente di 10 è negativo viene usata la notazione
# esponenziale.
# 
# Si possono calcolare termini qualunque, rispettando le priorità tra
# le operazioni
2+3*5; (2+3)*5; 3*8/2^2; 3*(8/2)^2
[1] 17
[1] 25
[1] 6
[1] 48
#
# In matematica è comodo assegnare dei nomi a dei numeri in modo da non
# doverli ricordare per esteso e riscrivere ogni volta. Questi nomi vengono
# chiamati variabili in quanto i loro valori possono essere variati, ossia
# cambiati di volta in volta. Essi devono iniziare con una lettera.  Per
# assegnare un valore ad una variabile in R occorre usare una freccia,
# ossia <- o ->. Per vedere il valore di una variabile occorre batterne il
# nome, come accade per ogni altra espressione.
a <- 7; 12 -> b; a+b; a*b; pippo <- a*b-4; pippo
[1] 19
[1] 84
[1] 80
#
# Posso assegnare lo stesso valore contemporaneamente a più variabili:
c <- b <- a <- 13.15; a; b; c
[1] 13.15
[1] 13.15
[1] 13.15
#
# Vediamo come calcolare il 5% di 380:
5/100*380
[1] 19
#
# Vediamo come calcolare il 5% e il 15% di 380, 275, 637
p1 <- 5/100; p2 <- 15/100
tot <- 380; p1*tot; p2*tot
[1] 19
[1] 57
tot <- 275; p1*tot; p2*tot
[1] 13.75
[1] 41.25
tot <- 637; p1*tot; p2*tot
[1] 31.85
[1] 95.55
#
# Una collezione di numeri può essere scritta così:
x <- c(55,67,71,49,58,72,65,58,67,52,60); x
 [1] 55 67 71 49 58 72 65 58 67 52 60
# Se voglio eseguire una operazione su di essi, posso comandare
# l'operazione sulla variabile che li rappresenta tutti:
x*2; (x+10)/2
[1] 110 134 142  98 116 144 130 116 134 104 120
[1] 32.5 38.5 40.5 29.5 34.0 41.0 37.5 34.0 38.5 31.0 35.0
#
# Con  c  posso collezionare anche dati già collezionati:
c(x, x*2,( x+10)/2)
 [1]  55.0  67.0  71.0  49.0  58.0  72.0  65.0  58.0  67.0  52.0
[11]  60.0 110.0 134.0 142.0  98.0 116.0 144.0 130.0 116.0 134.0
[21] 104.0 120.0  32.5  38.5  40.5  29.5  34.0  41.0  37.5  34.0
[31]  38.5  31.0  35.0
# Qui si capisce che cosa significa [ ]: se un comando dà più uscite,
# esse vengono numerate (nel caso di sopra sono 33).
#
# Con seq(A,B,p) genero la sequenza di numeri che parte da A ed arriva
# a B avanzando di passo p. Esempi:
seq(1,11,2); seq(2,11,2); seq(1,11,1); seq(0,4,0.5)
[1]  1   3   5   7   9  11
[1]  2   4   6   8  10
[1]  1   2   3   4   5   6   7   8   9  10  11
[1] 0.0 0.5 1.0 1.5 2.0 2.5 3.0 3.5 4.0
#
# Schiacciando il tasto freccia ^ [v] si rivedono preced. [segu.] comandi:
# cosa COMODA per rivedere, correggere o modificare precedenti comandi.
#
# Il comando fractions consente di approssimare numeri decimali con
# frazioni (occore, però, prima, battere library(MASS) per caricare
# questo comando).
library(MASS)
25/100; fractions(25/100)
[1] 0.25
[1] 1/4
fractions(1/5+3/5); fractions(1/2+1/3); fractions(120/100)
[1] 4/5
[1] 5/6
[1] 6/5
#
# Per indicare la radice quadrata si usa sqrt (square root):
sqrt(64); sqrt(0); sqrt(-4)
[1] 8
[1] 0
[1] NaN
# NaN sta per "not a number" (non è un numero)
#
# In matematica vengono chiamate funzioni dei procedimenti per assegnare a
# degli input degli ouput: ad un numero il suo doppio, ad una coppia di
# numeri la loro somma, ad un elenco di nomi il loro elenco in ordine
# alfabetico, ... Vediamo come si possono definire in R:
sec <- function(h,m,s) h*60*60+m*60+s
sec(1,0,0); sec(1,30,0); sec(2,45,30)
[1] 3600
[1] 5400
[1] 9930
# Abbiamo definito la funzione  sec  che dato un tempo in ore, minuti e
# secondi lo esprime in soli secondi.
#
# Vediamo come calcolare il costo di parmigiano reggiano dal prezzo di
# 18.30 euro al chilogrammo. Vediamo il costo di 317 g e di 3/4 kg:
costo <- function(chilogrammi) chilogrammi*18.30
costo(0.317); costo(3/4)
[1] 5.8011
[1] 13.725
#
# Con round si può arrotondare agli interi o a N cifre dopo "."
round( costo(3/4) );  round( costo(3/4), 2 )
[1] 14
[1] 13.73
#
# Posso tracciare il grafico di una funzione a 1 input e 1 output. Ecco
# quello del costo del parmigiano al variare del peso tra 0 e 2 kg:
plot(costo,0,2)

# Il comando è plot; occorre indicare il nome della funzione (costo) e da
# dove (0) a dove (2) far variare l'input. Sul grafico la variabile di
# input viene indicata x.
# Se vogliamo possiamo tracciare gli assi: col comando abline posso
# tracciare delle linee rette orizzontali (h) e verticali (v).
# Aggiungendo lty=3 le linee vengono tratteggiate.
# Con points posso segnare dei punti.
abline(v=c(0.5,1,1.5,2), h=c(5,10,15,20,25,30,35), lty=3)
abline(v=0, h=0)
points(1, costo(1));  points(0.7, costo(0.7))

# Se voglio posso colorare griglie o grafici aggiungendo col="red" o col=
# "blue", "orange", "green", "brown", grey", "violet", …
# Posso tracciare una griglia verticale (v) od orizzontale (h) usando il
# comando seq (vedi):
plot(costo,0,2)
abline(v=seq(0, 2, 0.2),h=seq(0,35, 5), lty=3, col="blue")
abline(v=0,h=0, col="blue")
points(1, costo(1), col="red")

# Se voglio posso scegliere l'intervallo delle "y" (le coordinate verticali)
# col comando ylim e posso aggiungere un grafico ad un altro con add=TRUE;
# con lwd=3 posso triplicare lo spessore (width in inglese) delle linee.
costo2 <- function(kg) 5+kg*11
plot(costo,0,2, ylim=c(-5,40), lwd=3)
abline(v=seq(0, 2, 0.1),h=seq(-5,40, 5), lty=3, col="brown")
abline(v=0,h=0, col="blue")
plot(costo2,0,2, add=TRUE,col="red", lwd=3)

# Operando col mouse sulla barra del titolo della finestra grafica posso
# spostarla. Operando su bordi od angoli di essa posso ridimensionarla.
# Con windows(4,4) (o windows(5,3) o …) posso aprire una nuova finestra.
windows(4,4); plot(costo,0,3,lwd=3); abline(v=0,h=0, col="blue")

#
#
# ================== se vuoi salta la parte qui racchiusa ==================
#
# Per semplificarci la vita possiamo "caricare" dei comandi che ci consentono
# di fare le cose più facilmente. Ad esempio ecco cosa ottengo battendo:
source("http://macosa.dima.unige.it/R/curve.txt")
 [1] frazio(7/20+1/6)   scrive 7/20+1/6 come frazione           <--  ESEMPI 
 [2] box(-5,8, 0,7)     Apre una finestra (box) con x da -5 a 8, y da 0 a 7.
 [3] boxm(-5,8, -1,12)       Apre un box con scala monometrica, cioè con la 
 [4]                                        stessa unità grafica sugli assi.
 [5] grafico(F,-2,4, 3)     Traccia il grafico di F tra -2 e 4 nel colore 3;
 [6]                        [ prova ad es. con:   g <- function(x) (x+1)^2 ]
 [7] graficob(F,-2,4, 3)  traccia il grafico di F scegliendo da solo il box;
 [8] soluz(F,7, 1,3)    risolve F(x)=7 se tra 1 e 3  F scavalca il valore 7;
 [9] minmax(F,2,5)      trova dove F ha min o max se tra 2 e 5 ha una gobba;
[10] punto(1,3/2, 3)  il punto (1,3/2) nel colore 3 (il col. 0 lo cancella);
[11] punto(c(-4,1,6),c(2,6,0), 2)   i punti (-4,2),(1,6),(6,0) nel colore 2;
[12] punt(..)   pun(..)   pu(..)       come  punto  ma di dimensioni minori;
[13] segmento(-2,5, 3,0.5, 4)  il segmento da (-2,5) a (3,0.5) nel colore 4;
[14] raggio(2,4, 5,20, 6)  il segm. da (2,4) lungo 5 con dir. 20° nel col.6;
[15] cerchio(2,4, 3, 1)  il cerchio di centro (2,4) e raggio 3 nel colore 1;
[16] poligono(2,4, 3, 5,30, 2)   il polig. regolare di 5 lati inscritto nel 
[17]                   cerchio precedente con un vertice a 30° nel colore 2;
[18] curva(K,5) la curva K(x,y)=0 nel col.5 [es. h <- function(x,y) x+y^2-1]
[19]  Col col. 0 la fig. (grafico,..) è tratteggiata, con 'white' cancellata
[20] P()        Traccia il punto che 'clicco' e ne visualizza le coordinate.
# Sono comandi che ci consentono (oltre che fare il calcolo frazionario, ri-
# solvere equazioni, ...) il tracciamento di varie figure. Es.:
frazio(7/20+1/6)             # ottengo 31/60  
areaQuad <- function(lato) lato^2
boxm(-1,3, 0,5)              # predispongo un rettangolo monometrico
grafico(areaQuad,0,3, 2)     # vi traccio il grafico di areaQuad
raggio(0,3, 1,0, 3); raggio(0,3, 1,120, 4); raggio(0,3, 1,240, 5)
punto(0,3, 1)                # il punto 0,3 e raggi da esso lunghi 1
poligono(2,1, 1, 3,90, 6)    # ho tracciato un triangolo equilatero,
cerchio(2,1, 1, 0)           # un cerchio tratteggiato e
punto(c(-1,0,3),c(1,2,4),4)  # i punti (-1,1),(0,2),(3,4)
r <- function(x,y) x-2; curva(r,1)     # una retta
s <- function(x,y) x+y-5; curva(s,7)   # un'altra
# Ecco che cosa ho ottenuto:

# Ecco i colori corrispondenti ai vari numeri (ma al posto di un numero
# si può mettere il nome, in inglese)
box(1,8,0.5,1.5); for(i in 1:8) punto(i,1,i); punto(4.5,1,"orange")

# Ovvero:
boxm(-8,8, -8,8); for(i in 1:8) cerchio(0,0, i, i)

# Rivediamo il grafico precedente:
graficob(costo, 0,2, 3)
punto(1,costo(1), 4); punto(0.7,costo(0.7), 2)

#
# Vediamo un altro esempio di funzione, usando i comandi caricati:
#
# Un piccolo gelataio produce e vende un solo tipo di cono, con i seguenti
# costi: 0.50 euro di spese incoporate (per latte, cacao, cialde, ...) e
# 2000 euro di spese fisse mensili (per locali, energia elettrica, ...)
SpeseFisse <- 2000;  SpeseIncorporate <- 0.50
# Quanto gli costa un gelato se al mese ne vende N?
CostoUnitario <- function(N) SpeseIncorporate + SpeseFisse/N
# Se ne traccio il grafico per N tra 0 e 5000 ottengo, supponendo che mi
# interessi vedere quando il costo unitario è inferiore a 10 euro:
box(0,5000, 0,10)
grafico(CostoUnitario,0,5000, 1)

# Nel grafico precedente c'è anche, tratteggiata, la retta orizzontale
# passante per 2. Se il prezzo di un gelato è 2 euro, essa
# rappresenta tale prezzo. È stata tracciata con:
segmento(0,2, 5000,2, 0)      # da (0,2) a (5000,2)
# È stata tracciata anche la retta verticale che passa per il punto del
# grafico con ordinata 2. Ecco come è stata trovata la ascissa:
# da 2 = SpeseIncorporate+SpeseFisse/n    ricavo
# 2-SpeseIncorporate = SpeseFisse/n
# n = SpeseFisse/(2-SpeseIncorporate)
n <- SpeseFisse/(2-SpeseIncorporate); n
[1] 1333.333
# e come è stata tracciata la retta verticale di tale ascissa:
segmento(1333.333,0, 1333.333,10, 0)
# ed evidenziato il punto di intersezione:
punto(1333.333,2, 2)
# Potevo trovare automaticamente la soluzione con:
soluz(CostoUnitario,2, 1000,2000)
[1] 1333.333
# ======================= fine della parte saltabile =======================
#
#
# Vediamo un altro esempio di funzione.
#
# Un piccolo gelataio produce e vende un solo tipo di cono, con i seguenti
# costi: 0.50 euro di spese incoporate (per latte, cacao, cialde, ...) e
# 2000 euro di spese fisse mensili (per locali, energia elettrica, ...)
SpeseFisse <- 2000;  SpeseIncorporate <- 0.50
# Quanto gli costa un gelato se al mese ne vende N?
CostoUnitario <- function(N) SpeseIncorporate + SpeseFisse/N
# Se ne traccio il grafico per N tra 0 e 5000 ottengo:

# Lasciando al programma la scelta della scala non vedo molto. Se mi interessa
# vedere quando il costo unitario è inferiore a 10 euro scelgo:
plot(CostoUnitario,0,5000, ylim=c(0,10), lwd=3)
abline(v=seq(0,5000,500),h=seq(0,10,1), lty=3, col="brown")
abline(v=0,h=0,col="blue")

# Se interessa sapere quanti gelati si producono e vendono quando il costo è
# di 2 euro posso fare un zoom:
plot(CostoUnitario,1200,1500, lwd=3); abline(h=2)

# Un altro zoom:
plot(CostoUnitario,1330,1335, lwd=3); abline(h=2)

# Se si producono e vendono 1334 gelati il costo è inferiore a 2 €. Ovviamente
# il valore, nella pratica, va preso in modo approssimato. Possiamo dire che
# se si producono e vendono circa 1300 gelati il costo è di circa 2 €.
# In questo caso potevo risolvere il problema senza ricorrere al grafico:
# da 2 = SpeseIncorporate+SpeseFisse/n    ricavo
# 2-SpeseIncorporate = SpeseFisse/n
# n = SpeseFisse/(2-SpeseIncorporate)
n <- SpeseFisse/(2-SpeseIncorporate); n
[1] 1333.333
#
#
# Ecco come fare qualche analisi statistica di dati.
# Ecco le altezze di 3 ragazze di scuola media e l'esito di alcuni calcoli:
x <- c(145,152,147)
c( min(x), max(x), sum(x) )
[1] 145 152 444
c( length(x), sum(x)/length(x), mean(x) )
[1]   3  148  148
# si sono trovati il minimo, il massimo e la somma dei dati; poi si sono
# scritti quanti sono i dati, la loro media, espressa come somma divisa
# per il numero dei dati o direttamente.
#
# Vediamo la analoga analisi fatta su più dati:
alu <- c(146,158,152,140,157,147,161,147,149,154,155,153,155,156,150,153,152,145)
c( min(alu), max(alu), length(alu) )
[1] 140 161  18
c( min(alu), max(alu), length(alu), mean(alu), median(alu) )
[1] 140.0000 161.0000  18.0000 151.6667 152.5000
# Abbiamo stampato anche la mediana, ossia il valore che sta a metà
# dell'elenco. Si noti che quando si stampano più dati usando c(...) essi
# vengono tutti scritti con cifre dopo il "." se ce n'è qualcuno che
# ne ha.  Alla fine abbiamo stampato anche il valore della mediana ossia il
# valore che sta al centro dell'elenco.
#
# Ecco l'istogramma. Il programma sceglie automaticamente le classi in
# cui classificare i dati. Il comando è hist.
hist(alu)

# Vegono rappresentate le frequenze delle varie classi in cui sono
# stati suddivisi i dati.  Se aggiungiamo probability=TRUE otteniamo
# la stessa figura (vedi immagine di sopra, a destra), ma cambia la scala
# verticale: sono rappresentate non le frequenze ma le frequenze relative
# (o densità di frequenza), ossia le frequenze divise per l'ampiezza
# degli intervalli.
# Con angle e density possiamo tracciare dei segmenti opportunamente
# inclinati e più o meno fitti.
hist(alu, probability=TRUE)
hist(alu, probability=TRUE, angle=45,density=7)
#
# Volendo posso decidere una sequenza di classi in cui classificare i dati.
# Basta che usi seq(A,B,h) per classificarli tra A e B in classi ampie h.
hist(alu, seq(140,161,3))

#
# Con summary ho una sintesi delle informazioni numeriche sui dati.
# Vengono stampati anche il 1° e il 3° quartile, cioè i dati che stanno
# a metà della prima metà e a metà della seconda metà dei dati; la
# mediana sarebbe il 2° quartile.
summary(alu)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  140.0   147.5   152.5   151.7   155.0   161.0
#
# Se abbiamo più dati da analizzare li mettiamo su più righe:
alu2 <- c(146,158,152,140,157,147,161,147,149,154,155,153,
155,156,150,153,152,145,158,140,147,149,155,156,153,145,
141,156,158,151,161,148,157,159,160,162,149,163,152,149,
157,155)
# Ecco la loro analisi statistica:
hist(alu2)
hist(alu2,seq(140,164,3))

summary(alu2)
   Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
  140.0   149.0   153.0   152.6   157.0   163.0
#
# Ecco come possiamo confrontare graficamente i due insiemi di dati:
hist(alu,seq(140,164,3),angle=45,density=7,probability=TRUE)
hist(alu2,seq(140,164,3),probability=TRUE,add=TRUE,angle=135,density=10)
# Ho aggiunto add=TRUE al comando per tracciare il 2° istogramma.

#
# Volendo posso introdurre una quantità variabile di input direttamente
# da tastiera mediante il comando  scan(file="",n=...)  in cui al posto
# di ... occorre mettere i dati da leggere. Due esempi. Il primo (faccio
# la somma di 3 numeri):
numeri <- scan(file="", n=3); sum(numeri)
 1: 3
 2: 7
 3: 5
 Read 3 items
[1] 15
# Il secondo (introduco un numero N e, poi, una quantità N di dati, di
# cui viene calcolata la media):
nalu <- scan(file="",n=1); altalu <- scan(file="",n=nalu); mean(altalu)
 1: 7
 Read 1 item
 1: 154
 2: 156
 3: 163
 4: 170
 5: 161
 6: 156
 7: 159
Read 7 items
[1] 159.8571
# 

 #  ;  ,  *  e  ^ priorità
variabili  <−<− … <− %  c(...)  [...] 
 ^ v fractionssqrtNaNfunction
roundplotablineltypoints
colylimlwdadd=TRUEcaricare comandi
comandi graficimin max sumlength meanmedianhist
probabilityangle densityseqsummarypiù righe
scan