PENGENALAN R PROGRAMMING Bagian I Adnan Sauddin Jurusan Matematika, Fakultas Sains dan Teknologi, UINAM [email protected] Info: Jurnal MSA Vol. 2 No. 2 Edisi: Juli – Desember 2014 Artikel No.: 7 Halaman: 51 -59 ISSN: 2355-083X Prodi Matematika UINAM ABSTRAK R Programming merupakan suatu bahasa pemrograman khusus untuk matematika dan statistika yang bersifat open source. Keunggulan dari aplikasi ini adalah dapat diperoleh secara terbuka tanpa membeli lisensi. Pada R programming juga pengguna dapat melakukan analisis dengan hanya menulis fungsi yang diinginkan dengan paket yang telah tersedia yang banyak pengembang dan atau membuat sendiri list program sesuai dengan rumus dari data yang akan dianalisis. Kekuatan R programming berada pada Keterbukaannya sehingga tersedia banyak paket yang dibuat oleh orang-orang yang kompenten sehingga memudahkan bagi pengguna yang tidak memiliki kemampuan komputasi yang lebih. Aplikasi ini juga mengkover hampir semua formula dalam matematika dan statistic, seperti, vektor dan matriks. Kata Kunci:R Programming, vektor, matriks, opensource. 1. PENGANTAR R R adalah bahasa pemrograman untuk analisis statistic dan grafik yang didistribusikan dibawah lisensi GNU Genaral Public License. R memberikan fleksibilitas dan kekuatan dan konsisten yang mengintegasikan tool-tool untuk manipulasi data, analisis dan menampilkannya. Software R dapat didownload secara gratis di CRAN; http://r-project.org 2. Definisi-Definisi dalam R Berikut beberapa definisi dari istilah-istilah yang digunakan Dalam R Object R merupakan suatu bahasa berorientasi obyek dan semua yang didalam R merupakan obyek. Sebagai contoh, suatu bilangan adalah obyek, suatu variable adalah obyek, output adalah obyek, himpunan data adalah obyek yang merupakan kumpulan obyek Vektor Suatu kumpulan dari satu atau lebih obyek dari jenis yang sama, contoh; semua bilangan atau semua huruf Function suatu kumpulan instruksi yang menghasilkan satu atau lebih obyek. Function 50 biasanya digunakan untuk melakukan tugastugas tertentu atau umum yang membutuhkan banyak instruksi. Sebagai contoh; function mean() digunakan untuk menghitung rata-rata aritmetika dari nilai vector numeric yang diberikan. Function memuat nama diikuti oleh tanda kurung yang memuat himpunan parameter (dinyatakan sebagai argument) atau kosong. Parameter jenis informasi yang dapat ditempatkan pada function. Sebagai contoh; mean(), fungsi yang membutuhkan satu parameter Argument informasi tertentu yang berkaitan dengan function untuk menentukan bagaimana fungsi seharus melakukan tugasnya. Argumen dinyatakan Dalam bentuk name=value ditempatkan diantara dua kurung yang diikuti oleh nama fungsi. Contoh; fungsi mean() membutuhkan paling sedikit satu argument. Operator symbol yang digunakan untuk melakukan kerja tertentu atau symbol yang bermakna, seperti +, -, * dan /. Operator = Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 digunakan untuk menyatakan nilai argument dari suatu fungsi. Operator logika, TRUE atau FALSE, < (ruang kiri lebih kecil dari ruang kanan), > (ruang kiri lebih besar dari ruang kanan), >= (ruang kiri lebih besar atau sama dengan ruang kanan, <= (ruang kiri lebih kecil atau sama dengan ruang kanan, == (nilai ruang kiri sama dengan ruas kanan, != (ruang kiri tidak sama dengan ruang kanan), && (logika DAN), || (logika ATAU). 3. Nama Object Semua obyek namanya harus unik. Aturannya adalah: Nama harus huruf Nama tidak boleh memuat karakter: spasi, -+*/#%&[]{}()~ Aturan penamaan: Semua perintah dalam R bersifat case sensitive. Nama harus menggambarkan obyek 4. Expression, Assignment dan Aritmetic Expression adalah perintah yang dimasukkan pada command prompt R, dievaluasi oleh R lalu dicetak ke monitor. Contoh ← (expression) ← output hasil evaluasi > 2 + 3 [1] 5 Assignment menyatakan suatu nama ke obyek baru yang mungkin merupakan hasil evaluasi expression atau obyek yang lain. Operator assignment adalah < -. > VAR1 <- 2 + 3 > VAR1 [1] 5 ← menyatakan expression pada obyek VAR1 ← Cetak isi obyek VAR1 ← hasil evaluasi Kita juga bias membagi perintah-perintah dalam R, > VAR2 <- ← assignment/ expression tidak atau belum lengkap + 2 + 3 > VAR2 ← melengkapi assignment atau expression ← cetak isi VAR2, keluaran hasil evaluasi [1] 5 Jika nilai suatu vektor adalah numeric, maka operator-opetor aritmetika dapat diterapkan > VAR2 - 1 ← cetak isi dari VAR2 dikurangi 1 [1] 4 > ANS1 <- VAR1 * VAR2 ← evaluasi expression dinyatakan pada ANS1 > ANS1 ←cetak isi dari ANS1 sebagai hasil evaluasi [1] 25 Obyek juga bisa digabungkan dengan menggunakan fungsi c() – concatenation ← menggambungkan 1, 2 and 6 [1] 1 2 6 ← mencetak hasil > c(VAR1, ANS1) ← menggabungkan isi VAR1 dan ANS1 [1] 5 25 ← cetak hasil > c(1, 2, 6) 5. Session dan Workspace R Membersihkan session Untuk melihat semua obyek yang aktif yang telah dibuat sebelumnya: ← tampilkan obyek aktif dalam R [1] "ANS1" "VAR1" "VAR2" > ls() Fungsi ls() juga dapat digunakan untuk mencari nama obyek yang telah dibuat sebelumnya. > ls(pat = "VAR") ←tampilkan obyek yang dibulai dengan VAR [1] "VAR1" "VAR2" > ls(pat = "A*1") ←tampilkan obyek yang memuat A dan 1 dengan sejumlah karakater diantara keduanya 51 Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 dari ‘from’ hingga ‘to’ dengan kenaikan ‘by’ [1] "ANS1" "VAR1" Untuk menghapus obyek digunakan fungsi rm() dalam memory > rm(VAR1, VAR2) ← hapus obyek VAR1 dan VAR2 > rm(list = ls()) ← hapus semua obyek yang telah didefinisikan sebelumnya Direktori aktif Secara default, tempat kita bekerja berada dalam direktori yang diatur oleh R, namun kita juga dapat mengatur pada direktori mana kita akan bekerja, dengan menggunakan fungsi setdw() dan untuk mengetahui director aktif gunakan fungsi getdw(). > setwd("~/Documents/") ←set the current working directory > getwd() ←review the current working directory [1] "/home/murray/Documents" > list.files(getwd()) [1] "addressbook.vcf" [2] "Introduction.rnw" ←menampilkan semua file direktori aktif [3] "Introduction.rnw.map" [4] "Rplots.ps" [5] "Rscripts.R" Fungsi Fungsi adalah sekumpulan perintah yang dikumpulkan secara bersama-sama sedemikian hingga perintah-perintah tersebut dapat dimulai atau dijalankan melalui satu perintah yang menyatukan seluruh masukan dari user pada sembarang perintah internal. Fungsi membutuhkan satu atau lebih input yang disebut argument. Berikut struktur yang digunakan: > seq (from, to) ← barisan bilangan dari ‘from’ hingga ‘to’ dengan kenaikan 1 > seq (from, to, by=) ← barisan bilangan 52 > seq (from, to, length.out=) ← barisan bilanga ‘length.out’ dari ‘from’ to ‘to’ Contoh > seq(9,5) [1] 9 8 7 6 5 > seq(5,9) [1] 5 6 7 8 9 > seq(from=5, to=9) [1] 5 6 7 8 9 > seq(to=9, by=3), from=5) Error: unexpected ',' "seq(to=9, by=3)," > seq(to=9, by=3, from=5) [1] 5 8 in Urutan Operator Operator Description [ [[ indexing :: name space $ component ^ exponentiation (evaluated right to left) - + sign (unary) : sequence %special% special operators (e.g. %/%, %%) * \ multiplication, division + addition and subtraction < > <= >= ordering and comparison == != ! logical negation (not) & && logical AND | || logical OR ~ formula -> ->> assignment (left to right) = argument assignment (right to left) <- <<assignment (right to left) ? help Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 . Vektor Vector adalah kumpulan satu atau lebih entri dari class (type) kelas yang sama. Table 1.2 kelas-kelas Obyek Vektor dalam R. The operator : digunakan untuk membangkitkan barisan bilangan bulat. Fungsi c() merupapkan penulisan ringkas untuk concatenate (penggabungan) dan dapat digunakan untuk membangkitkan vektor. operator == melakukan eveluasi sisi kiri apakah sama dengan sisi kanan Vector class Integer (Whole numbers) Example > 2:4 #vector of integers from 2 to 4 [1] 2 3 4 > c(1,3,9) #vector of integers [1] 1 3 9 numeric (Real numbers) > c(8.4, 2.1) #vector of real numbers [1] 8.4 2.1 character > c('A', 'ABC') (Letters) [1] "A" "ABC" #vector of letters logical > c(2:4)==3 #evaluate the expression (TRUE or FALSE) [1] FALSE TRUE FALSE #the printed logical vector Variable biologi adalah sekumpulan pengamatan dari jenis yang sama (contoh; variable suhu memuat kumpulan pengukuran suhu) dan disajikan dalam bentuk vektor. Variable kontinu biologi digambarkan dengan numeric vectors, dimana variable kategorial merupakan cara terbaik digambarkan dengan vektor. Regular atau Pola Barisan Barisan inklusi bilangan bulat dapat dibangkitkan dengan menggunakan: operator > # barisan inklusif dari 18 hingga 10 > 18:10 [1] 18 17 16 15 14 13 12 11 10 Contoh > temperatur <-c(36.1, 30.6,31,39.9,6.5,11.2,12.8,9.7,1 5.9) > temperatur [1] 36.1 30.6 31.0 39.9 6.5 11.2 12.8 9.7 15.9 Fungsi seq() digunakan untuk membangkitkan barisan numeric #Bilangan dari 2 hingga <= 20 dengan kenaikan 4 > seq(from=2, to=20, by=4) [1] 2 6 10 14 18 > seq(from=2,to=20, length=5) [1] 2.0 6.5 11.0 15.5 20.0 53 Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 Barisan dari entri yang berulang, dapat dilakukan dengan rep() dalam menggunakan fungsi names() untuk nama anggota dari vektor TEMPERATUR: > rep (4,5) > names(TEMPERATURE) <- QUADRATS > TEMPERATURE Q1 Q2 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 36.1 30.6 31.0 36.3 39.9 6.5 11.2 12.8 9.7 15.9 # mencetak ulang bilangan empat sebanyak 5 kali [1] 4 4 4 4 4 > rep("tidak",4) #mencetakn kata "tidak" sebanyak 4 kali [1] "tidak" "tidak" "tidak" "tidak" > rep(c(2,5),3) # mencetak deret 2 & 5 sebanyak 3 kali [1] 2 5 2 5 2 5 Vektor Karakter Penamaan Eksperimen atau unit sample dapat disimpan dalam vektor karakter Fungsi paste() dapat juga digunakan dalam konjungsi dengan fungsi lain untuk membangkitkan daftar label. Contoh, kita dapat menggabungkan suatu vektor dengan huruf A, B, C, D dan E dimana setiap karakter tersebut diulangi sebanyak dua kali secara berurutan (menggunakan fungsi rep() dengan vektor yang memuat 1 dan 2 untuk menghasilkan vektor karakter yang memiliki label disisinya. > QUADRATS <c("Q1","Q2","Q3","Q4","Q5") > QUADRATS [1] "Q1" "Q2" "Q3" "Q4" "Q5" > SITE <paste(rep(LETTERS[1:5],each=2),1 :2,sep="") > SITE [1] "A1" "A2" "B1" "B2" "C1" "C2" "D1" "D2" "E1" "E2" Cara yang mudah dan baik untuk membangkitkan vektor karakter diatas adalah dengan menggunakan fungsi paste(). Fungsi ini mengkonversi beberapa vektor ke dalam vektor karakter sebelum menggabungkan anggota dari setiap vektor secara bersama-sama ke dalam satu vektor karakter. Argument sep= digunakan untuk menyatakan pemisahan karakter (atau sekumpulan karakter) untuk memberikan jarak antara anggota vektor. Fungsi substr() digunakan untuk mengekstaksi bagian-bagian string (sekumpulan karakter) dalam vektor karakter dan selanjutnya berguna untuk membuat label-label terpotong. Contoh; jika kita mempunyai vektor karakter yang memuat name kota-kota besar di Indonesia dan perlu memberikan kode daerah (tiga huruf pertama) untuk pelabelan grafik: > QUADRATS <paste("Q",1:10,sep="") > QUADRATS [1] "Q1" "Q2" "Q3" "Q4" "Q5" "Q6" "Q7" "Q8" "Q9" "Q10" > paste ("quad",1:10,sep=".") [1] "quad.1" "quad.2" "quad.3" "quad.4" "quad.5" "quad.6" "quad.7" [8] "quad.8" "quad.9" "quad.10" Cara lain, gunakan fungsi abbreviate() Vektor karakter dapat digunakan untuk penamaan anggota vektor. Sebagai contoh, kita 54 > INDONESIA <c("Jakarta","Bandung","Surabaya" ,"Medan","Makassar","Palembang") > substr(INDONESIA,1,3) [1] "Jak" "Ban" "Sur" "Med" "Mak" "Pal" > abbreviate(INDONESIA,minlength=3) Jakarta Bandung Surabaya Medan Makassar Palembang "Jkr" "Bnd" "Srb" "Mdn" "Mks" "Plm" Variable kategorial dengan level-level diskrit dapat diwakilkan dengan vektor karakter. Contoh: Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 > SHADE <c("no","no","no","no","no","full"," full","full","full","full") > SHADE [1] "no" "no" "no" "no" "no" "full" "full" "full" "full" "full" Factor Untuk mengakomodasi variable kategorial (factor), R memiliki tambahan class dari vektor yang disebut factor yang menyimpan vektor yang bersesuaian dengan level dari variable factor. Fungsi factor mengkonversi vektor menjadi vektor factor. > SHADE <- factor(SHADE) > SHADE [1] no no no no no full full full full full Levels: full no Perhatikan perbedaan output dari vektor factor dan vektor karakter. Terdapat beberapa cara yang dapat digunakan untuk membangkitkan factor dalam R. penggabungan dari fungsi rep() dan fungsi concatenation(c()) dapat digunakan dalam berbagai cara untuk menghasilkan hasil yang indentik. > SHADE <factor(c(rep("no",5),rep("full", 5))) > SHADE <factor(rep(c("no","full"),c(5,5) )) > SHADE <factor(rep(c("no","full"),each=5 )) > SHADE [1] no no no no no full full full full full Levels: full no > SHADE <gl(2,1,10,c("no","full")) > SHADE [1] no full no full no full no full no full Levels: no full Fungsi factor menyusun level factor dalam urutan alphabet, dimana fungsi gl() mengurutkan level factor dalam urutan yang diikutkan dalam ekspresi. Matriks, lists dan data frame Matriks Fungsi matrix() > matrix(TEMPERATURE,nrow=5) [,1] [,2] [1,] 36.1 6.5 [2,] 30.6 11.2 [3,] 31.0 12.8 [4,] 36.3 9.7 [5,] 39.9 15.9 Matriks dapat juga digunakan untuk menggabungkan dua atau lebih vektor yang memilik panjang yang sama (dan class). Contoh, misalkan kita punya variable X dan Y, untuk menggabungkannya menjadi matriks digunakan fungsi cbind() atau rbind(): > X <c(16.92,24.03,7.61,15.49,11.77) > Y <c(8.37,12.93,16.65,12.2,13.12) > XY <-cbind(X,Y) > XY X Y [1,] 16.92 8.37 [2,] 24.03 12.93 [3,] 7.61 16.65 [4,] 15.49 12.20 [5,] 11.77 13.12 > rbind(X,Y) [,1] [,2] [,3] [,4] [,5] X 16.92 24.03 7.61 15.49 11.77 Y 8.37 12.93 16.65 12.20 13.12 Baris dan kolom dapat diberi nama atau label dengan menggunakan fungsi rownames() dan colnames(): > colnames(XY) 55 Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 [1] "X" "Y" > rownames(XY)<-LETTERS[1:5] > XY X Y A 16.92 8.37 B 24.03 12.93 C 7.61 16.65 D 15.49 12.20 E 11.77 13.12 > EXPERIMENT $SITE [1] "A1" "A2" "B1" "B2" "C1" "C2" "D1" "D2" "E1" "E2" Lists $TEMPERATURe Q1 Q2 Q3 Q4 Q5 Q7 Q8 Q9 Q10 36.1 30.6 31.0 36.3 39.9 11.2 12.8 9.7 15.9 List digunakan untuk menyimpan kumpulan obyek yang dapat berupa jenis dan panjang yang berbeda. List dikonstruksi menggunakan fungsi list(). Pada contoh sebelumnya kita telah membuat bilangan yang disimpan dalam vektor (temperature, shade, dan names dan kota-kota) yang secara actual menggambarkan data atau informasi dari satu eksperiment. Obyek-obyek tersebut dapat dikelompokkan secara bersamasama sehingga seluruhnya menjadi komponen dari daftar obyek; > EXPERIMENT <-list(SITE=SITE, COORDINATE=paste(X,Y,sep=","),TE MPERATURe=TEMPERATURE,SHADE=SHAD E + ) $COORDINATE [1] "16.92,8.37" "24.03,12.93" "7.61,16.65" "15.49,12.2" "11.77,13.12" $SHADE [1] no full no full no full no Levels: no full Q6 6.5 full no full Informasi Obyek dan Konversi Informasi Obyek Segala sesuatu di R merupakan obyek dan semua obyek memiliki type dan class tertentu. Class dari suatu obyek dapat diuji menggunakan fungsi class(). > class(TEMPERATURE) [1] "numeric" Ada juga fungsi is yang berguna untuk mengevaluasi apakah suatu obyek merupakan bagian class atau type tertentu atau bukan. Table 1.3 fungsi query obyek umum dan nilai yang dihasilkannya Function Returns TRUE: is.numeric(x) if all elements of x are numeric or integer (x <-c(1,-3.5)) is.null(x) if x is NULL (the object has no length) (x <-NULL) is.logical(x) if all elements of x are logical (x <- c(TRUE,FALSE)) is.character(x) if all elements of x are character strings (x <- c(,A,,,Quad,)) is.vector(x) if the object x is a vector (a single dimension). Returns FALSE if object has any attributes other than names 56 Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 is.factor(x) if the object x is a factor is.matrix(x) if the object x is a matrix (2 dimensions but not a data frame) is.list(x) if the object x is a list is.data.frame(x) if the object x is a data frame is.na(x) for each missing (NA) element in x (x <- c(NA,2)) ! (‘not’) character as a prefix converts the above functions into ‘is.not.’ Obyek dalam R juga ada yang memiliki atribut, bilangan dan type dari atribut tersebut berbeda pada setiap obyek. Contoh, obyek matriks mempunyai jumlah dimensi tertentu yang dikenal dengan baris dan kolom. Atribut dari suatu obyek dapat ditampilkan dengan menggunakan fungsi attributes(): > attributes(XY) $dim [1] 5 2 $dimnames $dimnames[[1]] [1] "A" "B" "C" "D" "E" > attr(XY,"dim") [1] 5 2 > attr(XY,"description") <"coodinates of quadrats" > XY X Y A 16.92 8.37 B 24.03 12.93 C 7.61 16.65 D 15.49 12.20 E 11.77 13.12 attr(,"description") [1] "coodinates of quadrats" Konversi Obyek $dimnames[[2]] [1] "X" "Y" Dengan cara yang sama, dapat juga dengan fungsi attr(), digunakan untuk menampilkan dan individual atribut dari suatu obyek. Obyek dalam R dapat dikonversi ke obyek lain menggunakan fungsi as. Function Converts object to as.numeric(x) a numeric vector (‘integer’ or ‘real’). Factors converted to integers. as.null(x) a NULL as.logical(x) a logical vector. Values of >1 converted to TRUE, otherwise FALSE as.character(x) a character vector as.vector(x) a vector. All attributes (including names) are removed. 57 Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 as.factor(x) a factor. This is an abbreviated version of factor as.matrix(x) a matrix. Any non-numeric elements result in all matrix elements being converted to character strings as.list(x) a list as.data.frame(x) a data frame. Matrix columns and list columns are converted into a separate vectors of the data frame, and character vectors are converted into factors. All previous attributes are removed > TEMPERATURE[-2] Q1 Q3 Q4 Q5 Q6 Q7 Q8 Q9 Q10 36.1 31.0 36.3 39.9 6.5 11.2 12.8 9.7 15.9 Meng-Indeks Vektor, Matriks dan Lists Meng-indeks Vektor Memungkinkan untuk mencetak subhimpunan dari suatu vektor dengan vektor indeks. Terdapat empat bentuk umum dari mengindeks vektor yang digunakan untuk mengekstrak subhimpunan dari vektor: Vektor Bilangan Bulat Positif. Suatu himpunan bilangan bulat yang mengindikasikan dimana elemen dari suatu vekto yang akan dipilih. Pemilihan elemen merupakan concatenated atau penggabungan dalam urutan yang spesifik. (i) Memilih himpulan elemen tertentu > TEMPERATURE[c(1,5,6,9)] Q1 Q5 Q6 Q9 36.1 39.9 6.5 9.7 Vektor Bilangan Bulat Negatif. Himpunan bilangan bulat yang mengindikasikan elemen vektor yang akan diekseksui dari concatenated (penggabungan) (iv) 58 Memilih semua tapi tidak termasuk elemen ke-n Memilih penamaan elemen > TEMPERATURE["Q1"] Q1 36.1 (ii) Memilih nama elemen > TEMPERATURE[c("Q1","Q4")] Q1 Q4 36.1 36.3 Memilih n elemen mulai dari elemen m > TEMPERATURE[2:5] Q2 Q3 Q4 Q5 30.6 31.0 36.3 39.9 (iii) (i) Memilih elemen ke-i > TEMPERATURE[2] Q2 30.6 (ii) Vektor karakterk string. Mengindeks vektor bentuk ini hanya mungkin untuk vektor yang elemennya telah diberi nama. Suatu vektor nama elemen dapat digunakan untuk memilih element untuk digabungkan Vektor Nilai Logika. Vektor nilai logika harus memiliki panjang yang sama sebagai suatu vektor subhimpunan dan biasanya merupakan hasil dari suatu evaluasi logika. Nila logika T (benar) dan F (salah) secara berurutan untuk dikaitkan dengan elemen vektor utama dari penggabungan. - Memilih elemen yang bernilai benar BENAR > TEMPERATURE[TEMPERATURE <15] Q6 Q7 Q8 Q9 6.5 11.2 12.8 9.7 Jurnal MSA, Vol. 2 No. 2, Juli-Des 2014 > TEMPERATURE[SHADE=="no"] Q1 Q3 Q5 Q7 Q9 36.1 31.0 39.9 11.2 9.7 - Memilih elemen untuk beberapa logika yang bernilai BENAR > TEMPERATURE[TEMPERATURE<34 & SHADE=="no"] Q3 Q7 Q9 31.0 11.2 9.7 - Memilih Suatu elemen atau logika lain yang bernilai BENAR > TEMPERATURE[TEMPERATURE < 10 | SHADE=="no"] Q1 Q3 Q5 Q6 Q7 Q9 36.1 31.0 39.9 6.5 11.2 9.7 6. Daftar Pustaka M. Logan. 2010. Biostatistical Design and Analysis Using R. John Wiley & Sons. New York John. M. Chambers, T. Hothron, 2015. Multiple Factor Analysis by Example Using R. CRC Press, California. R.S. Kennet, S.H.Zacks, 2014. Modern Industrial Statistics With Application in R, MINITAB and JMP. John Wiley & Sons, New York. URL: http://www.r-project.org/. Desember 2014 tgl. 16 URL: http://journal.r-project.org/. Desember 2014 tgl. 16 J.M. Chambers, 2014. Software for Data Analysis-Programming With R. John Wiley & Sons. New York. 59