Oggetti atomici in R

Alla fine di questa puntata…

  • dovreste conoscere (quasi) tutti gli oggetti “atomici” di R
  • dovreste riuscire a creare/modificare/cancellare un oggetto
  • dovreste riuscire a controllarne il contenuto
  • dovreste riuscire a salvare il lavoro fatto
  • dovreste riuscire a riutilizzare il lavoro fatto in precedenza
  • dovreste riuscire a riutilizzare il lavoro fatto in precedenza

e molto probabilmente…

  • potreste continuare a chiedervi “ma fa veramente al caso mio?”

Creazione di oggetti

Regole per la nomenclatura

  • combinazioni di caratteri e numeri
  • non sono consentiti spazi
  • attenzione alle maiuscole/minuscole
  • il nome deve iniziare con una lettera o con un punto (preferibilmente da evitare) ovvero non può iniziare con un numero (neanche se dopo il punto)
nomeVariabile operatoreAssegnazione espressione

ATTENZIONE: l’operazione di assegnazione è distruttiva

Operatore di assegnazione

Assegnazione esplicita

L’operatore di assegnazione:

primaVariabile <- 1 + 1

Un altro (equivalente ma meno preferibile) operatore di assegnazione:

primaVariabile = 1 + 1

Un altro (equivalente ma più naif) operatore di assegnazione (occhio alle parentesi):

(1 + 1) -> primaVariabile

La funzione per la stampa a video del contenuto di un oggetto:

print(primaVariabile)
[1] 2

o una scorciatoia:

primaVariabile
[1] 2

Attenzione: in alcuni casi (all’interno di funzioni e nei cicli di iterazione) è necessario usare la funzione print esplicitamente per visualizzare il contenuto di un oggetto (questo vale inparticolare per i grafici)

Assegnazione con stampa: tutto in una sola istruzione:

(secondaVariabile <- 2 + 2)
[1] 4

Assegnazione implicita

Posso non dare un nome agli oggetti:

3 + 3
[1] 6

ma R mantiene memoria dell’ultimo oggetto creato in una variabile speciale:

.Last.value
[1] 6

Il contenuto di un’espressione non assegnata può essere recuperato e utilizzato come tutti gli altri oggetti:

terzaVariabile <- .Last.value

Il nome di una variabile che inizia per .

.quartaVariabile <- "prova"

una variabile stringa che contiene un apice:

quintaVariabile <- "un'altra prova"

una meno comoda alternativa:

quintaVariabile <- 'un\'altra prova'
quintaVariabile
[1] "un'altra prova"

Ancora sulla nomenclatura degli oggetti

Nomi da evitare: - c, t, T, F, q - mean, median, …

Regole di stile: - nomeComposto (preferibile) - nome.composto - nome_composto

Una sintesi (con dettagli per i pignoli)

Assegnazione esplicita con stampa del risultato a video:

nomeVariabile <- espressione; nomeVariabile
(nomeVariabile <- espressione)

NOTA 1: Due comandi equivalenti:

nomeVariabile
print(nomeVariabile)

NOTA 2: la funzione print() é un esempio di funzione generica:

methods(print)
  [1] print.acf*                                          
  [2] print.activeConcordance*                            
  [3] print.AES*                                          
  [4] print.anova*                                        
  [5] print.aov*                                          
  [6] print.aovlist*                                      
  [7] print.ar*                                           
  [8] print.Arima*                                        
  [9] print.arima0*                                       
 [10] print.AsIs                                          
 [11] print.aspell*                                       
 [12] print.aspell_inspect_context*                       
 [13] print.bibentry*                                     
 [14] print.Bibtex*                                       
 [15] print.browseVignettes*                              
 [16] print.by                                            
 [17] print.changedFiles*                                 
 [18] print.check_bogus_return*                           
 [19] print.check_code_usage_in_package*                  
 [20] print.check_compiled_code*                          
 [21] print.check_demo_index*                             
 [22] print.check_depdef*                                 
 [23] print.check_details*                                
 [24] print.check_details_changes*                        
 [25] print.check_doi_db*                                 
 [26] print.check_dotInternal*                            
 [27] print.check_make_vars*                              
 [28] print.check_nonAPI_calls*                           
 [29] print.check_package_code_assign_to_globalenv*       
 [30] print.check_package_code_attach*                    
 [31] print.check_package_code_data_into_globalenv*       
 [32] print.check_package_code_startup_functions*         
 [33] print.check_package_code_syntax*                    
 [34] print.check_package_code_unload_functions*          
 [35] print.check_package_compact_datasets*               
 [36] print.check_package_CRAN_incoming*                  
 [37] print.check_package_datalist*                       
 [38] print.check_package_datasets*                       
 [39] print.check_package_depends*                        
 [40] print.check_package_description*                    
 [41] print.check_package_description_encoding*           
 [42] print.check_package_license*                        
 [43] print.check_packages_in_dir*                        
 [44] print.check_packages_used*                          
 [45] print.check_po_files*                               
 [46] print.check_pragmas*                                
 [47] print.check_Rd_line_widths*                         
 [48] print.check_Rd_metadata*                            
 [49] print.check_Rd_xrefs*                               
 [50] print.check_RegSym_calls*                           
 [51] print.check_S3_methods_needing_delayed_registration*
 [52] print.check_so_symbols*                             
 [53] print.check_T_and_F*                                
 [54] print.check_url_db*                                 
 [55] print.check_vignette_index*                         
 [56] print.checkDocFiles*                                
 [57] print.checkDocStyle*                                
 [58] print.checkFF*                                      
 [59] print.checkRd*                                      
 [60] print.checkRdContents*                              
 [61] print.checkReplaceFuns*                             
 [62] print.checkS3methods*                               
 [63] print.checkTnF*                                     
 [64] print.checkVignettes*                               
 [65] print.citation*                                     
 [66] print.cli_ansi_html_style*                          
 [67] print.cli_ansi_string*                              
 [68] print.cli_ansi_style*                               
 [69] print.cli_boxx*                                     
 [70] print.cli_diff_chr*                                 
 [71] print.cli_doc*                                      
 [72] print.cli_progress_demo*                            
 [73] print.cli_rule*                                     
 [74] print.cli_sitrep*                                   
 [75] print.cli_spark*                                    
 [76] print.cli_spinner*                                  
 [77] print.cli_tree*                                     
 [78] print.codoc*                                        
 [79] print.codocClasses*                                 
 [80] print.codocData*                                    
 [81] print.colorConverter*                               
 [82] print.compactPDF*                                   
 [83] print.condition                                     
 [84] print.connection                                    
 [85] print.CRAN_package_reverse_dependencies_and_views*  
 [86] print.data.frame                                    
 [87] print.Date                                          
 [88] print.default                                       
 [89] print.dendrogram*                                   
 [90] print.density*                                      
 [91] print.difftime                                      
 [92] print.dist*                                         
 [93] print.Dlist                                         
 [94] print.DLLInfo                                       
 [95] print.DLLInfoList                                   
 [96] print.DLLRegisteredRoutines                         
 [97] print.document_context*                             
 [98] print.document_position*                            
 [99] print.document_range*                               
[100] print.document_selection*                           
[101] print.dummy_coef*                                   
[102] print.dummy_coef_list*                              
[103] print.ecdf*                                         
[104] print.eigen                                         
[105] print.factanal*                                     
[106] print.factor                                        
[107] print.family*                                       
[108] print.fileSnapshot*                                 
[109] print.findLineNumResult*                            
[110] print.formula*                                      
[111] print.ftable*                                       
[112] print.function                                      
[113] print.getAnywhere*                                  
[114] print.glm*                                          
[115] print.hashtab*                                      
[116] print.hclust*                                       
[117] print.help_files_with_topic*                        
[118] print.hexmode                                       
[119] print.HoltWinters*                                  
[120] print.hsearch*                                      
[121] print.hsearch_db*                                   
[122] print.htest*                                        
[123] print.html*                                         
[124] print.html_dependency*                              
[125] print.htmltools.selector*                           
[126] print.htmltools.selector.list*                      
[127] print.htmlwidget*                                   
[128] print.infl*                                         
[129] print.integrate*                                    
[130] print.isoreg*                                       
[131] print.json*                                         
[132] print.key_missing*                                  
[133] print.kmeans*                                       
[134] print.knitr_kable*                                  
[135] print.Latex*                                        
[136] print.LaTeX*                                        
[137] print.libraryIQR                                    
[138] print.listof                                        
[139] print.lm*                                           
[140] print.loadings*                                     
[141] print.loess*                                        
[142] print.logLik*                                       
[143] print.ls_str*                                       
[144] print.medpolish*                                    
[145] print.MethodsFunction*                              
[146] print.mtable*                                       
[147] print.NativeRoutineList                             
[148] print.news_db*                                      
[149] print.nls*                                          
[150] print.noquote                                       
[151] print.numeric_version                               
[152] print.object_size*                                  
[153] print.octmode                                       
[154] print.packageDescription*                           
[155] print.packageInfo                                   
[156] print.packageIQR*                                   
[157] print.packageStatus*                                
[158] print.paged_df*                                     
[159] print.pairwise.htest*                               
[160] print.person*                                       
[161] print.POSIXct                                       
[162] print.POSIXlt                                       
[163] print.power.htest*                                  
[164] print.ppr*                                          
[165] print.prcomp*                                       
[166] print.princomp*                                     
[167] print.proc_time                                     
[168] print.quosure*                                      
[169] print.quosures*                                     
[170] print.raster*                                       
[171] print.Rconcordance*                                 
[172] print.Rd*                                           
[173] print.recordedplot*                                 
[174] print.restart                                       
[175] print.RGBcolorConverter*                            
[176] print.RGlyphFont*                                   
[177] print.rlang_box_done*                               
[178] print.rlang_box_splice*                             
[179] print.rlang_data_pronoun*                           
[180] print.rlang_dict*                                   
[181] print.rlang_dyn_array*                              
[182] print.rlang_envs*                                   
[183] print.rlang_error*                                  
[184] print.rlang_fake_data_pronoun*                      
[185] print.rlang_lambda_function*                        
[186] print.rlang_message*                                
[187] print.rlang_trace*                                  
[188] print.rlang_warning*                                
[189] print.rlang_zap*                                    
[190] print.rlang:::list_of_conditions*                   
[191] print.rle                                           
[192] print.rlib_bytes*                                   
[193] print.rlib_error_3_0*                               
[194] print.rlib_trace_3_0*                               
[195] print.roman*                                        
[196] print.scalar*                                       
[197] print.sessionInfo*                                  
[198] print.shiny.tag*                                    
[199] print.shiny.tag.env*                                
[200] print.shiny.tag.list*                               
[201] print.shiny.tag.query*                              
[202] print.simple.list                                   
[203] print.smooth.spline*                                
[204] print.socket*                                       
[205] print.srcfile                                       
[206] print.srcref                                        
[207] print.stepfun*                                      
[208] print.stl*                                          
[209] print.StructTS*                                     
[210] print.subdir_tests*                                 
[211] print.summarize_CRAN_check_status*                  
[212] print.summary.aov*                                  
[213] print.summary.aovlist*                              
[214] print.summary.ecdf*                                 
[215] print.summary.glm*                                  
[216] print.summary.lm*                                   
[217] print.summary.loess*                                
[218] print.summary.manova*                               
[219] print.summary.nls*                                  
[220] print.summary.packageStatus*                        
[221] print.summary.ppr*                                  
[222] print.summary.prcomp*                               
[223] print.summary.princomp*                             
[224] print.summary.table                                 
[225] print.summary.warnings                              
[226] print.summaryDefault                                
[227] print.suppress_viewer*                              
[228] print.table                                         
[229] print.tables_aov*                                   
[230] print.terms*                                        
[231] print.ts*                                           
[232] print.tskernel*                                     
[233] print.TukeyHSD*                                     
[234] print.tukeyline*                                    
[235] print.tukeysmooth*                                  
[236] print.undoc*                                        
[237] print.vignette*                                     
[238] print.warnings                                      
[239] print.xfun_raw_string*                              
[240] print.xfun_record_results*                          
[241] print.xfun_rename_seq*                              
[242] print.xfun_strict_list*                             
[243] print.xgettext*                                     
[244] print.xngettext*                                    
[245] print.xtabs*                                        
see '?methods' for accessing help and source code
print(1:30)
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
[26] 26 27 28 29 30
print(matrix(1:30, 6, 5))
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    7   13   19   25
[2,]    2    8   14   20   26
[3,]    3    9   15   21   27
[4,]    4   10   16   22   28
[5,]    5   11   17   23   29
[6,]    6   12   18   24   30
print(iris)
    Sepal.Length Sepal.Width Petal.Length Petal.Width    Species
1            5.1         3.5          1.4         0.2     setosa
2            4.9         3.0          1.4         0.2     setosa
3            4.7         3.2          1.3         0.2     setosa
4            4.6         3.1          1.5         0.2     setosa
5            5.0         3.6          1.4         0.2     setosa
6            5.4         3.9          1.7         0.4     setosa
7            4.6         3.4          1.4         0.3     setosa
8            5.0         3.4          1.5         0.2     setosa
9            4.4         2.9          1.4         0.2     setosa
10           4.9         3.1          1.5         0.1     setosa
11           5.4         3.7          1.5         0.2     setosa
12           4.8         3.4          1.6         0.2     setosa
13           4.8         3.0          1.4         0.1     setosa
14           4.3         3.0          1.1         0.1     setosa
15           5.8         4.0          1.2         0.2     setosa
16           5.7         4.4          1.5         0.4     setosa
17           5.4         3.9          1.3         0.4     setosa
18           5.1         3.5          1.4         0.3     setosa
19           5.7         3.8          1.7         0.3     setosa
20           5.1         3.8          1.5         0.3     setosa
21           5.4         3.4          1.7         0.2     setosa
22           5.1         3.7          1.5         0.4     setosa
23           4.6         3.6          1.0         0.2     setosa
24           5.1         3.3          1.7         0.5     setosa
25           4.8         3.4          1.9         0.2     setosa
26           5.0         3.0          1.6         0.2     setosa
27           5.0         3.4          1.6         0.4     setosa
28           5.2         3.5          1.5         0.2     setosa
29           5.2         3.4          1.4         0.2     setosa
30           4.7         3.2          1.6         0.2     setosa
31           4.8         3.1          1.6         0.2     setosa
32           5.4         3.4          1.5         0.4     setosa
33           5.2         4.1          1.5         0.1     setosa
34           5.5         4.2          1.4         0.2     setosa
35           4.9         3.1          1.5         0.2     setosa
36           5.0         3.2          1.2         0.2     setosa
37           5.5         3.5          1.3         0.2     setosa
38           4.9         3.6          1.4         0.1     setosa
39           4.4         3.0          1.3         0.2     setosa
40           5.1         3.4          1.5         0.2     setosa
41           5.0         3.5          1.3         0.3     setosa
42           4.5         2.3          1.3         0.3     setosa
43           4.4         3.2          1.3         0.2     setosa
44           5.0         3.5          1.6         0.6     setosa
45           5.1         3.8          1.9         0.4     setosa
46           4.8         3.0          1.4         0.3     setosa
47           5.1         3.8          1.6         0.2     setosa
48           4.6         3.2          1.4         0.2     setosa
49           5.3         3.7          1.5         0.2     setosa
50           5.0         3.3          1.4         0.2     setosa
51           7.0         3.2          4.7         1.4 versicolor
52           6.4         3.2          4.5         1.5 versicolor
53           6.9         3.1          4.9         1.5 versicolor
54           5.5         2.3          4.0         1.3 versicolor
55           6.5         2.8          4.6         1.5 versicolor
56           5.7         2.8          4.5         1.3 versicolor
57           6.3         3.3          4.7         1.6 versicolor
58           4.9         2.4          3.3         1.0 versicolor
59           6.6         2.9          4.6         1.3 versicolor
60           5.2         2.7          3.9         1.4 versicolor
61           5.0         2.0          3.5         1.0 versicolor
62           5.9         3.0          4.2         1.5 versicolor
63           6.0         2.2          4.0         1.0 versicolor
64           6.1         2.9          4.7         1.4 versicolor
65           5.6         2.9          3.6         1.3 versicolor
66           6.7         3.1          4.4         1.4 versicolor
67           5.6         3.0          4.5         1.5 versicolor
68           5.8         2.7          4.1         1.0 versicolor
69           6.2         2.2          4.5         1.5 versicolor
70           5.6         2.5          3.9         1.1 versicolor
71           5.9         3.2          4.8         1.8 versicolor
72           6.1         2.8          4.0         1.3 versicolor
73           6.3         2.5          4.9         1.5 versicolor
74           6.1         2.8          4.7         1.2 versicolor
75           6.4         2.9          4.3         1.3 versicolor
76           6.6         3.0          4.4         1.4 versicolor
77           6.8         2.8          4.8         1.4 versicolor
78           6.7         3.0          5.0         1.7 versicolor
79           6.0         2.9          4.5         1.5 versicolor
80           5.7         2.6          3.5         1.0 versicolor
81           5.5         2.4          3.8         1.1 versicolor
82           5.5         2.4          3.7         1.0 versicolor
83           5.8         2.7          3.9         1.2 versicolor
84           6.0         2.7          5.1         1.6 versicolor
85           5.4         3.0          4.5         1.5 versicolor
86           6.0         3.4          4.5         1.6 versicolor
87           6.7         3.1          4.7         1.5 versicolor
88           6.3         2.3          4.4         1.3 versicolor
89           5.6         3.0          4.1         1.3 versicolor
90           5.5         2.5          4.0         1.3 versicolor
91           5.5         2.6          4.4         1.2 versicolor
92           6.1         3.0          4.6         1.4 versicolor
93           5.8         2.6          4.0         1.2 versicolor
94           5.0         2.3          3.3         1.0 versicolor
95           5.6         2.7          4.2         1.3 versicolor
96           5.7         3.0          4.2         1.2 versicolor
97           5.7         2.9          4.2         1.3 versicolor
98           6.2         2.9          4.3         1.3 versicolor
99           5.1         2.5          3.0         1.1 versicolor
100          5.7         2.8          4.1         1.3 versicolor
101          6.3         3.3          6.0         2.5  virginica
102          5.8         2.7          5.1         1.9  virginica
103          7.1         3.0          5.9         2.1  virginica
104          6.3         2.9          5.6         1.8  virginica
105          6.5         3.0          5.8         2.2  virginica
106          7.6         3.0          6.6         2.1  virginica
107          4.9         2.5          4.5         1.7  virginica
108          7.3         2.9          6.3         1.8  virginica
109          6.7         2.5          5.8         1.8  virginica
110          7.2         3.6          6.1         2.5  virginica
111          6.5         3.2          5.1         2.0  virginica
112          6.4         2.7          5.3         1.9  virginica
113          6.8         3.0          5.5         2.1  virginica
114          5.7         2.5          5.0         2.0  virginica
115          5.8         2.8          5.1         2.4  virginica
116          6.4         3.2          5.3         2.3  virginica
117          6.5         3.0          5.5         1.8  virginica
118          7.7         3.8          6.7         2.2  virginica
119          7.7         2.6          6.9         2.3  virginica
120          6.0         2.2          5.0         1.5  virginica
121          6.9         3.2          5.7         2.3  virginica
122          5.6         2.8          4.9         2.0  virginica
123          7.7         2.8          6.7         2.0  virginica
124          6.3         2.7          4.9         1.8  virginica
125          6.7         3.3          5.7         2.1  virginica
126          7.2         3.2          6.0         1.8  virginica
127          6.2         2.8          4.8         1.8  virginica
128          6.1         3.0          4.9         1.8  virginica
129          6.4         2.8          5.6         2.1  virginica
130          7.2         3.0          5.8         1.6  virginica
131          7.4         2.8          6.1         1.9  virginica
132          7.9         3.8          6.4         2.0  virginica
133          6.4         2.8          5.6         2.2  virginica
134          6.3         2.8          5.1         1.5  virginica
135          6.1         2.6          5.6         1.4  virginica
136          7.7         3.0          6.1         2.3  virginica
137          6.3         3.4          5.6         2.4  virginica
138          6.4         3.1          5.5         1.8  virginica
139          6.0         3.0          4.8         1.8  virginica
140          6.9         3.1          5.4         2.1  virginica
141          6.7         3.1          5.6         2.4  virginica
142          6.9         3.1          5.1         2.3  virginica
143          5.8         2.7          5.1         1.9  virginica
144          6.8         3.2          5.9         2.3  virginica
145          6.7         3.3          5.7         2.5  virginica
146          6.7         3.0          5.2         2.3  virginica
147          6.3         2.5          5.0         1.9  virginica
148          6.5         3.0          5.2         2.0  virginica
149          6.2         3.4          5.4         2.3  virginica
150          5.9         3.0          5.1         1.8  virginica
print(diag)
function (x = 1, nrow, ncol, names = TRUE) 
{
    if (is.matrix(x)) {
        if (nargs() > 1L && (nargs() > 2L || any(names(match.call()) %in% 
            c("nrow", "ncol")))) 
            stop("'nrow' or 'ncol' cannot be specified when 'x' is a matrix")
        if ((m <- min(dim(x))) == 0L) 
            return(vector(typeof(x), 0L))
        y <- x[1 + 0L:(m - 1L) * (dim(x)[1L] + 1)]
        if (names) {
            nms <- dimnames(x)
            if (is.list(nms) && !any(vapply(nms, is.null, NA)) && 
                identical((nm <- nms[[1L]][seq_len(m)]), nms[[2L]][seq_len(m)])) 
                names(y) <- nm
        }
        return(y)
    }
    if (is.array(x) && length(dim(x)) != 1L) 
        stop("'x' is an array, but not one-dimensional.")
    if (missing(x)) 
        n <- nrow
    else if (length(x) == 1L && nargs() == 1L) {
        n <- as.integer(x)
        x <- 1
    }
    else n <- length(x)
    if (!missing(nrow)) 
        n <- nrow
    if (missing(ncol)) 
        ncol <- n
    .Internal(diag(x, n, ncol))
}
<bytecode: 0x7fad8ee097e0>
<environment: namespace:base>

NOTA 3: In alcuni casi é necessario, per stampare il contenuto di un oggetto, è necessario chiamare esplicitamente la funzione print() - strutture di programmazione

for(i in 1:5) i
for(i in 1:5) print(i)
[1] 1
[1] 2
[1] 3
[1] 4
[1] 5
  • quando si richiama un file script da R
source("nomeFileScript.R")

Gestione del workspace

Cosa ho a disposizione?

  • finestra Workspace di RStudio

  • prompt dei comandi (due comandi equivalenti):

ls()
[1] "i"                "primaVariabile"   "quintaVariabile"  "secondaVariabile"
[5] "terzaVariabile"  
objects()
[1] "i"                "primaVariabile"   "quintaVariabile"  "secondaVariabile"
[5] "terzaVariabile"  
ls(all.names=TRUE)
[1] ".main"               ".quartaVariabile"    ".QuartoInlineRender"
[4] "i"                   "primaVariabile"      "quintaVariabile"    
[7] "secondaVariabile"    "terzaVariabile"     
objects(all.names=TRUE)
[1] ".main"               ".quartaVariabile"    ".QuartoInlineRender"
[4] "i"                   "primaVariabile"      "quintaVariabile"    
[7] "secondaVariabile"    "terzaVariabile"     

Facciamo un po’ di pulizia…

Cancellare una variabile:

rm(primaVariabile)

Cancellare due (o più) variabili:

rm(secondaVariabile, terzaVariabile)

Cosa rimane?

ls()
[1] "i"               "quintaVariabile"

Il primo esempio di funzioni innestate:

rm(list=ls())

Cosa rimane?

ls()
character(0)

Siamo sicuri?

ls(all.names=TRUE)
[1] ".main"               ".quartaVariabile"    ".QuartoInlineRender"

Facciamo piazza pulita…

rm(list=ls(all.names=TRUE))

Costanti

COSTANTE DESCRIZIONE
.Last.value ultimo valore non assegnato
NULL oggetto nullo
NA not available
NaN not a number
Inf infinito
TRUE (T) vero
FALSE (F) falso
pi pi greco
LETTERS lettere maiuscole
letters lettere minuscole
month.name nomi dei mesi
month.abb nomi abbreviati dei mesi

Operatori

  • Operatori aritmetici

    ?Arithmetic
  • Operatori relazionali (o di confronto)

    ?Comparison
  • Operatori logici

    ?Logic
    ?base::Logic
    

NOTA: Regole di priorità

?Syntax

Le parentesi tonde possono essere usate per cambiare l’ordine

Nota tecnica (per gli schizzinosi)

Ogni espressione ha un equivalente in termini di funzione

variabile1 <- 1
assign("variabile2", 2)
ls()
[1] "variabile1" "variabile2"
nomeVariabile <- 'variabile3'
assign(nomeVariabile,3)
ls()
[1] "nomeVariabile" "variabile1"    "variabile2"    "variabile3"   
variabile3 * 10
[1] 30
'*'(variabile3,10)
[1] 30
variabile3 <- variabile3 * 10
assign('variabile3','*'(variabile3,10))
variabile3
[1] 300

Operatori aritmetici

OPERATORE FUNZIONE DESCRIZIONE
+ “+”() addizione
- “-”() sottrazione
* “*”() moltiplicazione
/ “/”() divisione
^ “^”() elevamento a potenza
** “**”() elevamento a potenza
%/% “%/%”() quoziente intero della divisione
%% “%%”() resto della divisione (modulo)

Operatori relazionali

OPERATORE FUNZIONE DESCRIZIONE
< “<”() minore
<= “<=”() minore o uguale
> “>”() maggiore
>= “>=”() maggiore o uguale
== “==”() uguale
!= “!=”() diverso

Operatori (e funzioni) logici

OPERATORE FUNZIONE DESCRIZIONE
! “!”() not
| “|”() or (termine a termine)
& “&”() and (termine a termine)
xor() or esclusivo (termine a termine)
|| “||”() or (primo elemento)
&& “&&”() and (primo elemento)
identical() controlla se due oggetti sono identici
any() almeno una condizione TRUE
all() tutte le condizioni TRUE

In carrozza…

Partiamo da capo

rm(list = ls())

#ecco uno scalare

scalare <- 1; scalare
[1] 1

#un vettore di due numeri

(vettoreLunghezza2 <- c(2, 3))
[1] 2 3

#un vettore di tre caratteri

vettoreCaratteri <- c("a", "b", "cc")
vettoreCaratteri
[1] "a"  "b"  "cc"

#un vettore di 10 numeri

vettoreLunghezza10 <- 1:10; vettoreLunghezza10
 [1]  1  2  3  4  5  6  7  8  9 10

#una matrice

matrice1 <- matrix(1:10, 5, 2); matrice1
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

#che avrei potuto creare anche a partire da una variabile #presente sul workspace

matrix(vettoreLunghezza10, 5, 2)
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

La chiamata di funzioni…

Guardiamo i dettagli della funzione matrix

?matrix

Sintassi di chiamata per posizione

matrice1 <- matrix(1:10, 5, 2); matrice1
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

Sintassi di chiamata per nome

matrice1 <- matrix(nrow=5, ncol=2, data=1:10); matrice1
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

Sintassi di chiamata mista

matrice1 <- matrix(nrow=5, 1:10, 2); matrice1
     [,1] [,2]
[1,]    1    6
[2,]    2    7
[3,]    3    8
[4,]    4    9
[5,]    5   10

Cambio il valore di un argomento che ha un default

matrice1 <- matrix(1:10, 5, 2, byrow=T); matrice1
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
[4,]    7    8
[5,]    9   10

Se il numero di elementi eccede le posizioni vengono presi solo quelli necessari

(matrice2 <- matrix(12:1, 1, nrow=6))
Warning in matrix(12:1, 1, nrow = 6): data length differs from size of matrix:
[12 != 6 x 1]
     [,1]
[1,]   12
[2,]   11
[3,]   10
[4,]    9
[5,]    8
[6,]    7

Posso specificare tutti i parametri:

(matrice2 <- matrix(12:1, 1, nrow=6, ncol=2))
     [,1] [,2]
[1,]   12   11
[2,]   10    9
[3,]    8    7
[4,]    6    5
[5,]    4    3
[6,]    2    1

così come posso fare calcolare a R i valori di alcuni argomenti a partire da quelli passati in input

(matrice2 <- matrix(12:1, ncol=2))
     [,1] [,2]
[1,]   12    6
[2,]   11    5
[3,]   10    4
[4,]    9    3
[5,]    8    2
[6,]    7    1

Anche se il numero di elementi è minore delle posizioni da riempire R provvede automaticamente a “sistemare” le cose: primo esempio della regola del riciclaggio

(matrice2 <- matrix(100, 1, nrow=6))
     [,1]
[1,]  100
[2,]  100
[3,]  100
[4,]  100
[5,]  100
[6,]  100

Attenzione: anche se potrebbe sembrare un vettore, questa è una matrice e non un vettore con una dimensione

NOTA: riempiamo di vuoti gli oggetti…

Per inizializzare vettori numerici da riempire successivamente:

numeric(10)
 [1] 0 0 0 0 0 0 0 0 0 0

potrei essere anche più preciso:

integer(10)
 [1] 0 0 0 0 0 0 0 0 0 0
double(10)
 [1] 0 0 0 0 0 0 0 0 0 0

Per inizializzare un vettore di stringhe da riempire successivamente:

character(10)
 [1] "" "" "" "" "" "" "" "" "" ""

In carrozza (2)…

Un altro vettore (con 12 elementi):

vettoreLunghezza12 <- 12:1

e uno con tre elementi:

vettoreLunghezza3 <- 1:3

un array tridimensionale:

array3d <- array(1:24, dim=c(4,3,2))
array3d
, , 1

     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

, , 2

     [,1] [,2] [,3]
[1,]   13   17   21
[2,]   14   18   22
[3,]   15   19   23
[4,]   16   20   24

Esploriamo gli oggetti (il primo attributo di un oggetto)…

Stampo gli oggetti disponibili con informazioni sul relativo contenuto

ls.str()
array3d :  int [1:4, 1:3, 1:2] 1 2 3 4 5 6 7 8 9 10 ...
matrice1 :  int [1:5, 1:2] 1 3 5 7 9 2 4 6 8 10
matrice2 :  num [1:6, 1] 100 100 100 100 100 100
scalare :  num 1
vettoreCaratteri :  chr [1:3] "a" "b" "cc"
vettoreLunghezza10 :  int [1:10] 1 2 3 4 5 6 7 8 9 10
vettoreLunghezza12 :  int [1:12] 12 11 10 9 8 7 6 5 4 3 ...
vettoreLunghezza2 :  num [1:2] 2 3
vettoreLunghezza3 :  int [1:3] 1 2 3

Lunghezza di un vettore:

vettoreLunghezza10
 [1]  1  2  3  4  5  6  7  8  9 10
length(vettoreLunghezza10)
[1] 10

di una matrice:

matrice1
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
[4,]    7    8
[5,]    9   10
length(matrice1)
[1] 10

e di un array a più dimensioni:

array3d
, , 1

     [,1] [,2] [,3]
[1,]    1    5    9
[2,]    2    6   10
[3,]    3    7   11
[4,]    4    8   12

, , 2

     [,1] [,2] [,3]
[1,]   13   17   21
[2,]   14   18   22
[3,]   15   19   23
[4,]   16   20   24
length(array3d)
[1] 24

Esploriamo gli oggetti (attributi aggiuntivi di un oggetto)…

Dimensione di un vettore:

dim(vettoreLunghezza10)
NULL

di una matrice:

dim(matrice1)
[1] 5 2

e di un array a più dimensioni

dim(array3d)
[1] 4 3 2

Ogni oggetto ha due attributi:

c(mode(vettoreCaratteri), mode(matrice1))
[1] "character" "numeric"  
c(length(vettoreCaratteri), length(matrice1))
[1]  3 10

Ma alcuni oggetti hanno “attributi” in più:

attributes(vettoreCaratteri)
NULL
attributes(matrice1)
$dim
[1] 5 2

Forma e sostanza

E’ possibile assegnare una dimensione differente e cambiare l’oggetto:

varAppoggio <- vettoreLunghezza10
dim(varAppoggio) <- c(2,5)
varAppoggio
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    3    5    7    9
[2,]    2    4    6    8   10
varAppoggio <- matrice1
dim(varAppoggio) <- c(2,5)

Confrontiamo la posizione degli elementi: come sono disposti rispetto all’oggetto di partenza?

vettoreLunghezza10
 [1]  1  2  3  4  5  6  7  8  9 10
matrice1
     [,1] [,2]
[1,]    1    2
[2,]    3    4
[3,]    5    6
[4,]    7    8
[5,]    9   10
varAppoggio
     [,1] [,2] [,3] [,4] [,5]
[1,]    1    5    9    4    8
[2,]    3    7    2    6   10

E’ anche possibile impostare a NULL la dimensione di un oggetto senza perdere il contenuto:

varAppoggio <- array3d
dim(varAppoggio) <- NULL
varAppoggio
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24

Mischiamo i tipi?

E’ possibile concatenare oggetti dello stesso tipo:

c(vettoreLunghezza2, vettoreLunghezza10)
 [1]  2  3  1  2  3  4  5  6  7  8  9 10

o di tipo differente:

c(vettoreLunghezza2, vettoreCaratteri)
[1] "2"  "3"  "a"  "b"  "cc"

il tipo più forte ha però la meglio:

mode(c(vettoreLunghezza2, vettoreCaratteri))
[1] "character"

La regola del riciclaggio

Nel caso di due vettori:

vettoreLunghezza10 + vettoreLunghezza10
 [1]  2  4  6  8 10 12 14 16 18 20
vettoreLunghezza2 + vettoreLunghezza10
 [1]  3  5  5  7  7  9  9 11 11 13
vettoreLunghezza3 + vettoreLunghezza10
Warning in vettoreLunghezza3 + vettoreLunghezza10: longer object length is not
a multiple of shorter object length
 [1]  2  4  6  5  7  9  8 10 12 11

Per capire meglio come funziona la regola del riciclaggio:

cbind(vettoreLunghezza10, vettoreLunghezza10)
      vettoreLunghezza10 vettoreLunghezza10
 [1,]                  1                  1
 [2,]                  2                  2
 [3,]                  3                  3
 [4,]                  4                  4
 [5,]                  5                  5
 [6,]                  6                  6
 [7,]                  7                  7
 [8,]                  8                  8
 [9,]                  9                  9
[10,]                 10                 10
cbind(vettoreLunghezza10, vettoreLunghezza2)
      vettoreLunghezza10 vettoreLunghezza2
 [1,]                  1                 2
 [2,]                  2                 3
 [3,]                  3                 2
 [4,]                  4                 3
 [5,]                  5                 2
 [6,]                  6                 3
 [7,]                  7                 2
 [8,]                  8                 3
 [9,]                  9                 2
[10,]                 10                 3
cbind(vettoreLunghezza10, vettoreLunghezza3)
Warning in cbind(vettoreLunghezza10, vettoreLunghezza3): number of rows of
result is not a multiple of vector length (arg 2)
      vettoreLunghezza10 vettoreLunghezza3
 [1,]                  1                 1
 [2,]                  2                 2
 [3,]                  3                 3
 [4,]                  4                 1
 [5,]                  5                 2
 [6,]                  6                 3
 [7,]                  7                 1
 [8,]                  8                 2
 [9,]                  9                 3
[10,]                 10                 1

In alcuni casi l’accostamento di oggetti di dimensione diversa porta a modifiche sulla struttura risultante

cbind(scalare, array3d)
      scalare array3d
 [1,]       1       1
 [2,]       1       2
 [3,]       1       3
 [4,]       1       4
 [5,]       1       5
 [6,]       1       6
 [7,]       1       7
 [8,]       1       8
 [9,]       1       9
[10,]       1      10
[11,]       1      11
[12,]       1      12
[13,]       1      13
[14,]       1      14
[15,]       1      15
[16,]       1      16
[17,]       1      17
[18,]       1      18
[19,]       1      19
[20,]       1      20
[21,]       1      21
[22,]       1      22
[23,]       1      23
[24,]       1      24

Il riciclaggio tra un vettore e una matrice:

cbind(matrice1, scalare)
          scalare
[1,] 1  2       1
[2,] 3  4       1
[3,] 5  6       1
[4,] 7  8       1
[5,] 9 10       1
cbind(matrice1, vettoreLunghezza10)
Warning in cbind(matrice1, vettoreLunghezza10): number of rows of result is not
a multiple of vector length (arg 2)
          vettoreLunghezza10
[1,] 1  2                  1
[2,] 3  4                  2
[3,] 5  6                  3
[4,] 7  8                  4
[5,] 9 10                  5
cbind(matrice1, vettoreLunghezza2)
Warning in cbind(matrice1, vettoreLunghezza2): number of rows of result is not
a multiple of vector length (arg 2)
          vettoreLunghezza2
[1,] 1  2                 2
[2,] 3  4                 3
[3,] 5  6                 2
[4,] 7  8                 3
[5,] 9 10                 2
cbind(matrice1, vettoreLunghezza3)
Warning in cbind(matrice1, vettoreLunghezza3): number of rows of result is not
a multiple of vector length (arg 2)
          vettoreLunghezza3
[1,] 1  2                 1
[2,] 3  4                 2
[3,] 5  6                 3
[4,] 7  8                 1
[5,] 9 10                 2

Operazioni tra un vettore e una matrice:

matrice1 + scalare
     [,1] [,2]
[1,]    2    3
[2,]    4    5
[3,]    6    7
[4,]    8    9
[5,]   10   11
matrice1 + vettoreLunghezza2
     [,1] [,2]
[1,]    3    5
[2,]    6    6
[3,]    7    9
[4,]   10   10
[5,]   11   13
matrice1 + vettoreLunghezza3
Warning in matrice1 + vettoreLunghezza3: longer object length is not a multiple
of shorter object length
     [,1] [,2]
[1,]    2    5
[2,]    5    5
[3,]    8    8
[4,]    8   11
[5,]   11   11

Operazioni tra un vettore e un array:

array3d + scalare
, , 1

     [,1] [,2] [,3]
[1,]    2    6   10
[2,]    3    7   11
[3,]    4    8   12
[4,]    5    9   13

, , 2

     [,1] [,2] [,3]
[1,]   14   18   22
[2,]   15   19   23
[3,]   16   20   24
[4,]   17   21   25
array3d + vettoreLunghezza2
, , 1

     [,1] [,2] [,3]
[1,]    3    7   11
[2,]    5    9   13
[3,]    5    9   13
[4,]    7   11   15

, , 2

     [,1] [,2] [,3]
[1,]   15   19   23
[2,]   17   21   25
[3,]   17   21   25
[4,]   19   23   27

Il riciclaggio tra due matrici non funziona:

cbind(matrice1, matrice2)

Si può però semplificare la struttura di output:

c(matrice1, matrice2)
 [1]   1   3   5   7   9   2   4   6   8  10 100 100 100 100 100 100

Lo stesso avviene anche se si lavora su un solo oggetto:

c(matrice1)
 [1]  1  3  5  7  9  2  4  6  8 10

Ma in sostanza cosa c’è in un oggetto?

Alcune funzioni per avere informazioni sui tipi di oggetti e sul loro contenuto:

vettoreIntero <- integer(2)
c(mode(vettoreIntero), class(vettoreIntero), typeof(vettoreIntero))
[1] "numeric" "integer" "integer"
vettoreDouble <- double(2)
c(mode(vettoreDouble), class(vettoreDouble), typeof(vettoreDouble))
[1] "numeric" "numeric" "double" 
altroVettoreCaratteri <- character(2)
c(mode(altroVettoreCaratteri), class(altroVettoreCaratteri), typeof(altroVettoreCaratteri))
[1] "character" "character" "character"
matriceInteri <- matrix(integer(4),2,2)
c(mode(matriceInteri), class(matriceInteri), typeof(matriceInteri))
[1] "numeric" "matrix"  "array"   "integer"
matriceDouble <- matrix(double(4),2,2)
c(mode(matriceDouble), class(matriceDouble), typeof(matriceDouble))
[1] "numeric" "matrix"  "array"   "double" 
matriceCaratteri <- matrix(character(4),2,2)
c(mode(matriceCaratteri), class(matriceCaratteri), typeof(matriceCaratteri))
[1] "character" "matrix"    "array"     "character"
arrayDouble <- array(double(24), c(4,3,2))
c(mode(arrayDouble), class(arrayDouble), typeof(arrayDouble))
[1] "numeric" "array"   "double" 

Facciamo un po’ d’ordine:

c(mode(vettoreIntero), mode(vettoreDouble), mode(altroVettoreCaratteri))
[1] "numeric"   "numeric"   "character"
c(mode(matriceInteri), mode(matriceDouble), mode(matriceCaratteri))
[1] "numeric"   "numeric"   "character"
c(typeof(vettoreIntero), typeof(vettoreDouble), typeof(altroVettoreCaratteri))
[1] "integer"   "double"    "character"
c(typeof(matriceInteri), typeof(matriceDouble), typeof(matriceCaratteri))
[1] "integer"   "double"    "character"
c(class(vettoreIntero), class(matriceDouble), class(arrayDouble))
[1] "integer" "matrix"  "array"   "array"  

E tu che tipo sei?

Alcune funzioni per controllare il tipo

is.integer(vettoreIntero)
[1] TRUE
is.integer(vettoreDouble)
[1] FALSE
is.integer(vettoreCaratteri)
[1] FALSE
is.double(vettoreIntero)
[1] FALSE
is.double(vettoreDouble)
[1] TRUE
is.double(vettoreCaratteri)
[1] FALSE
is.numeric(vettoreIntero)
[1] TRUE
is.numeric(vettoreDouble)
[1] TRUE
is.numeric(vettoreCaratteri)
[1] FALSE
is.character(vettoreIntero)
[1] FALSE
is.character(vettoreDouble)
[1] FALSE
is.character(vettoreCaratteri)
[1] TRUE
is.vector(scalare)
[1] TRUE
is.vector(vettoreLunghezza3)
[1] TRUE
is.vector(matrice1)
[1] FALSE
is.vector(array3d)
[1] FALSE
is.matrix(scalare)
[1] FALSE
is.matrix(vettoreLunghezza3)
[1] FALSE
is.matrix(matrice1)
[1] TRUE
is.matrix(array3d)
[1] FALSE
is.array(scalare)
[1] FALSE
is.array(vettoreLunghezza3)
[1] FALSE
is.array(matrice1)
[1] TRUE
is.array(array3d)
[1] TRUE

Tutti i tipi atomici hanno sempre elementi dello stesso tipo

is.atomic(scalare)
[1] TRUE
is.atomic(vettoreLunghezza3)
[1] TRUE
is.atomic(matrice1)
[1] TRUE
is.atomic(array3d)
[1] TRUE

Ma perchè non cambi un po’?

Alcuni funzioni di conversione tra tipi:

as.character(vettoreLunghezza2)
[1] "2" "3"
as.integer(as.character(vettoreLunghezza2))
[1] 2 3
as.integer(2.3)
[1] 2
as.double(as.integer(2.3))
[1] 2

Salviamo il salvabile: i dati

Per salvare l’intero contenuto del workspace su file se si salva su un file senza nome ma con estensione nella directory di lavoro il file sarà caricato direttamente in R al prossimo avvio:

getwd()
[1] "/Users/domenico.vistocco/Downloads/rlab_website/labs"
save.image()

Se si vuole invece specificare il nome di un file da salvare nella directory di lavoro:

save.image("introduzioneR.RData")

Se si vuole salvare l’intero contenuto del workspace in una directory differente basta specificare l’intero percorso (attenzione agli /):

save.image("disco/cartella1/sottocartella/introduzioneR.RData")

O se preferite lo  usatene due:

save.image("disco:\\cartella1\\sottocartella\\introduzioneR.RData")

All’apertura il file “.Rdata” nella directory di lavoro viene automaticamente caricato in R (per default). Se si vuole cancellare, ad esempio dopo un errore, basta usare la funzione load:

load()

Se si vuole caricare un file con un nome nella directory corrente:

load("introduzioneR.RData")

o in una directory diversa:

load("disco/cartella1/sottocartella/introduzioneR.RData")
load("disco:\\cartella1\\sottocartella\\introduzioneR.RData")

NOTA 1: non è necessario se abbiamo salvato un file .RData (senza nome) nella directory di lavoro di default NOTA 2: è più semplice usando RStudio NOTA 3: un file di tipo progetto permette di ripetere lo stesso tipo di lavoro in cartelle diverse

Un workspace “incrementale”

rm(list = ls())
var1 <- 1:10
save.image("workSpace1.RData")
rm(list = ls())
var2 <- letters[5:15]
save.image("workSpace2.RData")
rm(list = ls())
load("workSpace1.RData")
ls()
[1] "var1"
load("workSpace2.RData")
ls()
[1] "var1" "var2"

Un workspace “selezionato”

Rimettiamo le cose a posto:

rm(list = ls())
load("introduzioneR.RData")
ls()
 [1] "altroVettoreCaratteri" "array3d"               "arrayDouble"          
 [4] "matrice1"              "matrice2"              "matriceCaratteri"     
 [7] "matriceDouble"         "matriceInteri"         "scalare"              
[10] "varAppoggio"           "vettoreCaratteri"      "vettoreDouble"        
[13] "vettoreIntero"         "vettoreLunghezza10"    "vettoreLunghezza12"   
[16] "vettoreLunghezza2"     "vettoreLunghezza3"    

e salviamo solo quello che ci serve:

save(scalare, matrice1, matrice2, file="workSpace2.RData")

Per gli scettici:

rm(list=ls())
load("workSpace2.RData")
ls()
[1] "matrice1" "matrice2" "scalare" 

Salviamo il salvabile: i comandi

La funzione savehistory permette di salvare una lista dei comandi inviati nella sessione:

savehistory()

La funzione loadhistory permette di caricare una lista di comandi precedentemente salvati:

loadhistory()

NOTA 1: anche qui se non si specifica il percorso del file si salva la cronologia dei comandi nella cartella corrente NOTA 2: anche qui se non si specifica il nome del file si salva la cronologia dei comandi in un file “.Rhistory”

La funzione history permette di visualizzare una lista dei comandi inviati nella sessione:

history()

Che si intende per sessione?

Maggiori dettagli sul comando history sono forniti nell’help:

?history

Posso chiedere di visualizzare solo un certo numero di comandi, ad esempio i primi digitati nella sessione:

history(10, rev=FALSE)

ma anche gli ultimi:

history(10, rev=TRUE)

Posso usare il valore speciale Inf per visualizzare l’intera history dei comandi

history(Inf)

Salviamo il salvabile: un (grossolano) report

Una prima (grossolana) funzione per la gestione di output su file:

?sink

Controlliamo la directory corrente:

getwd()
[1] "/Users/domenico.vistocco/Downloads/rlab_website/labs"

E redirezionamo l’output su file: invece di scrivere sulla console, R utilizzerà il file:

sink("provaOutut.txt")
#due comandi di prova
a <- 1:10
a
 [1]  1  2  3  4  5  6  7  8  9 10

Chiusura del file:

sink()