Category Archives: R

Programmare con R

Why is OOP in R so confusing?

Author: Omar Trejo Navarro

Apart from the fact that R is an interpreted language, which can pretty much confuse people used to compiled languages, most programmers would agree that manipulating objects in R can sometimes be a nightmare. This has to do with two significant features of R that make OOP manipulation highly efficient:

  • R has several object models unlike Java, Python and others, which have only one
  • R implements parametric polymorphism, while other OOP (Object-oriented programming) languages generally implement polymorphism from inside an object

Let’s look at these two in a bit more detail.

Various object models

Working with OOP in R is different from what you may see in other languages such as Python, Java, C++, etc. These languages have a single object model. However, R has various object models, meaning that it lets us implement object-oriented systems in various ways. Specifically, R has the following object models:

  • S3
  • S4
  • Reference Classes
  • R6
  • Base Types

OOP1

In this article, we will look at S3, S4, and R6, since these are the most-used object models in R, but more on that later. Let’s first understand what parametric polymorphism is.

Parametric polymorphism

R implements parametric polymorphism, which implies that methods in R belong to functions, not classes. Parametric polymorphism basically lets you define a generic method or function for types of objects you haven’t yet defined and may never do. This means that you can use the same name for several functions with different sets of arguments and from various classes.

R’s method calls look just like function calls and R must have a mechanism to know which names require simple function calls and which names require method calls. This mechanism is called generics. Generics allow you to register certain names to be treated as methods in R, and they act as dispatchers. When these registered generic functions are called, R looks into a chain of attributes in the object being passed in the call in order to look for functions that match the method call for that object’s type. If it finds a function, it will call it.

You may have noted that the plot() and summary() functions in R may return different results depending on the objects being passed to them (e.g. a data frame or a linear model instance). This is because they are generic functions that implement polymorphism. This way of working provides simple interfaces for users and makes their tasks much simpler. For instance, if you are exploring a new package and you get some kind of result at some point derived from the package, try calling plot(result), and you may be surprised to get some kind of plot that makes sense. This is not common in other OOP languages.

Now that we have a basic idea of what parametric polymorphism is and how it sets R apart from other OOP languages, let’s look at S3, S4, and R6.

R’s most common object models

The S3 object model of R owes its roots to the object model of the S language, the predecessor of R. S’s object model evolved over time, and its third version introduced class attributes, which paved the way for S3. S3 is the fundamental object model of R, and many of R’s own built-in classes are of the S3 type.

Being the least formal object model in R, S3 does lack in some key respects:

  • It has no formal class definitions, thereby leaving no scope for inheritance or encapsulation
  • Polymorphism can only be implemented through generics

Nevertheless, it makes up for what it lacks in by providing quite a lot of flexibility to the programmers. In the words of Hadley Wickham, “S3 has a certain elegance in its minimalism: you can’t take away any part of it and still have a useful object-oriented system“.

However, one of the biggest demerits of S3 is that it doesn’t provide the required safety; it is very easy to create a class in S3, but it may lead to very confusing and hard-to-debug code if not used with utmost care. For example, a programmer could misspell a function and S3 would raise no issues. This is why S4 came into the picture, developed with the goal of adding safety. It keeps the code safe but, on the flip side, introduces a lot of verbosity to the code. It implements most features of modern object-oriented programming languages:

  • Formal class definitions
  • Inheritance
  • Polymorphism (parametric)
  • Encapsulation

In reality, S3 and S4 are really just ways to implement polymorphism for static functions. The R6 package provides a type of class that is similar to R’s Reference Classes, but it is more efficient and doesn’t depend on S4 classes and the methods package, as Reference Classes do.

When Reference Classes were introduced, some users called the new class system R5, following the names of R’s existing class systems S3 and S4. Although Reference Classes are not actually called R5 nowadays, the name of this package and its classes follow the pattern. Despite being first released over 3 years ago, R6 isn’t widely known. However, it is widely used. For example, R6 is used within Shiny and to manage database connections in the dplyr package.

The decision of which object model to use eventually boils down to a trade-off between flexibility, formality and code cleanness.

R Programming by Example

R is a high-level statistical language and is widely used among statisticians and data miners to develop analytical applications. Given the obvious advantages that R brings to the table, it has become imperative for data scientists to learn the essentials of the language.

R Programming by Example is a hands-on guide that helps you develop a strong fundamental base in R by taking you through a series of illustrations and examples. Written by Omar Trejo Navarro, the book starts with the basic concepts and gradually progresses towards more advanced concepts to give you a holistic view of R. Omar is a well-respected data consultant with expertise in applied mathematics and economics.

If you are an aspiring data science professional or statistician and want to learn more about R programming in a practical and engaging manner, R Programming by Example is the book for you!

OOP2

Tipi di variabili in R

python

In questo post approfondiremo il concetto di variabili in ambiente R fornendo una spiegazione sulle differenti tipologie di variabili.Il linguaggio R prevede due tipi di variabili:

1)     variabili globali;

2)     variabili locali;

Come si può intuire, le variabili globali sono accessibili a livello globale all’interno del programma, le variabili locali invece assumono significato solo ed esclusivamente nel settore di appartenenza, risultando visibili solo all’interno del metodo in cui vengono inizializzate.

Per la maggior parte dei compilatori, un nome di variabile può contenere fino a trentuno caratteri, in modo da poter adottare per una variabile un nome sufficientemente descrittivo, in R tale limite non è indicato. La scelta del nome assume un’importanza fondamentale al fine di rendere leggibile il codice; questo perché un codice leggibile sarà facilmente mantenibile anche da persone diverse dal programmatore che l’ha creato.

Abbiamo parlato d’inizializzazione della variabile intesa quale operazione di creazione della variabile; vediamone allora un esempio banale:

> a <- 1

In tale istruzione è stato utilizzato l’operatore di assegnazione (<-), con il significato di assegnare appunto alla locazione di memoria individuata dal nome a il valore 1. Il tipo attribuito alla variabile è stabilito in fase d’inizializzazione; sarà allora che si deciderà se assegnare a essa una stringa di testo, un valore booleano (true/false), un numero decimale etc.

Per approfondire l’argomento:

 

Variabili ed espressioni in R

python

Le Variabili ed espressioni in R sono trattate in modo moderno ed efficiente, infatti mentre nella maggior parte dei linguaggi di programmazione è necessaria una dichiarazione delle variabili utilizzate all’interno del programma, dichiarazione effettuata nella parte iniziale prima della sezione esecutiva dello stesso, in R tutto questo non è richiesto. Poiché il linguaggio non richiede la dichiarazione delle variabili; il tipo e la relativa dimensione saranno decisi nel momento in cui le stesse saranno inizializzate.

Con il termine variabile ci si riferisce a un tipo di dato il cui valore è variabile nel corso dell’esecuzione del programma. È però possibile assegnarne un valore iniziale, si parlerà allora d’inizializzazione della variabile. La fase d’inizializzazione, assume un’importanza fondamentale perché rappresenta il momento in cui la variabile è creata, tale momento coincide con quello in cui a essa è associato un dato valore.

A differenza dei linguaggi cosiddetti compilativi tale procedura può essere inserita in qualunque punto dello script, anche se i significati possono assumere valori differenti.

Nel momento in cui l’interprete s’imbatte in una variabile, deposita il valore relativo in una locazione di memoria e ogni volta che nel programma comparirà una chiamata a tale variabile, si riferirà a questa locazione. È regola di buona programmazione utilizzare dei nomi che ci permetteranno di riferirci in maniera univoca alle specifiche locazioni di memoria in cui i relativi dati sono stati depositati.

Per approfondire l’argomento:

I nomi in R

python

In questo post (I nomi in R) analizziamo le regole da seguire per scegliere correttamente i nomi di costanti, variabili, metodi, classi e moduli, che rappresentano gli elementi essenziali con i quali lavoreremo in questo ambiente.

Un nome in R allora può essere costituito da una lettera maiuscola, minuscola o dal simbolo . (punto), che a loro volta possono essere una qualsiasi combinazione di lettere maiuscole e minuscole, e cifre. I caratteri minuscoli corrispondono alle lettere minuscole dell’alfabeto dalla a alla z, mentre i caratteri maiuscoli corrispondono alle lettere maiuscole dell’alfabeto dalla A alla Z e le cifre da 0 al 9. Il numero di caratteri che compongono il nome non è limitato.

Di seguito riporto alcuni suggerimenti riportati nella guida ad R fornita da Google, su come denominare in modo corretto gli oggetti  (nomi in R) :

  • Non utilizzare mai caratteri di sottolineatura (_) o trattini (-) per identificare un oggetto in ambiente R.
  • Gli identificatori devono essere denominati in base alle seguenti convenzioni.
  • La forma preferita per i nomi delle variabili è di utilizzare tutte lettere minuscole e le parole devono essere separate da punti (variable.name), ma l’identicatore nella forma nomeVariabile è anche accettato.
  • I nomi delle funzioni hanno la lettera iniziale maiuscola e non deve essere utilizzato alcun punto (FunctionName).
  • Le costanti sono identificate allo stesso modo delle funzioni, ma con un k iniziale.

Per approfondire l’argomento:

Indentazione del codice in R

python

Anche se la struttura del linguaggio R prevede dei particolari delimitatori per alcuni blocchi di programma, risulta comunque utile, l’indentazione del codice in R, per la relativa individuazione.

Ricordiamo a tal proposito che per indentazione del codice s’intende quella tecnica utilizzata nella programmazione attraverso la quale si evidenziano dei blocchi di programma con l’inserimento di una certa quantità di spazio vuoto all’inizio di una riga di testo, allo scopo di aumentarne la leggibilità.

Anche se, come già detto, R prevede opportuni delimitatori per alcune strutture del linguaggio, utilizzeremo l’indentazione stessa per indicare i blocchi nidificati; a tal proposito si possono usare sia una tabulazione, sia un numero arbitrario di spazi bianchi.

Nell’utilizzo di tale tecnica è necessario ricordare delle semplici raccomandazione:

  • il numero di spazi da utilizzare è variabile;
  • tutte le istruzioni del blocco di programma devono presentare lo stesso numero di spazi di indentazione.

In tale ottica utilizzeremo la convenzione che prevede l’esclusivo utilizzo di due spazi per individuare un nuovo blocco e di tralasciare l’uso del tab. 

Per approfondire l’argomento:

Guida alla programmazione con R

python

Guida alla programmazione con R rappresenta un manuale di semplice consultazione destinato agli utenti alle prime armi che vogliono affrontare i rudimenti della programmazione utilizzando una piattaforma di programmazione in ambiente R. R si sta sempre più diffondendo nell’ambiente della programmazione in quanto si compone di un linguaggio e di un ambiente di runtime con un’interfaccia grafica, un debugger, l’accesso ad alcune funzioni di sistema, e offre la possibilità di eseguire programmi memorizzati in file di script. Ma R è molto di più, rappresenta infatti un vero linguaggio di programmazione, anzi un linguaggio di programmazione molto avanzato, e ciò permette di adattarlo ad ogni nostra esigenza.

Nella Guida alla programmazione con R sono affrontati tutti gli argomenti necessari per iniziare a programmare in R, in maniera semplice ed immediata partendo da zero. Ricca di esempi ed esercizi la guida ci aiuta nel percorso di apprendimento di un nuovo linguaggio di programmazione senza la necessità di competenze preventive sull’argomento.

Tra gli argomenti trattati nel testo:

-Variabili ed operatori
-Array e matrici
-Liste e dataframe
-Strutture per il controllo del flusso
-Operazioni di ingresso/uscita
-Gestione delle eccezioni
-Visualizzazione dei dati
-Tipi di grafici

L’autore
Ingegnere chimico, svolge la sua attività di tecnico presso la Seconda Università degli Studi di Napoli. Esperto di acustica, vanta una vasta esperienza nella docenza di corsi professionali di informatica e nel campo dell’e-learning; autore e titolare del sito www.ciaburro.it. Ha al suo attivo diverse publicazioni: monografie, riviste scientifiche e convegni tematici.

Elenco degli script R a corredo del testo:

– quadrato : Programma per il calcolo del quadrato di un numero
– calcolo_medie : Programma per il calcolo della media aritmetica e geometrica di due numeri
– radice : Programma per il calcolo della radice quadrata di un numero
– fattoriale : Programma per il calcolo del fattoriale di un numero
– triangolo : Programma per il calcolo dell’ipotenusa del triangolo
– mese : Programma per l’inserimento del numero di un mese da una lista
– solv_eq : Programma per la risoluzione di un’equazione di secondo grado
– uscita : Programma per l’uscita da un ciclo while
– write : Programma per la scrittura di dati in un file
– read : Programma per la scrittura di dati in un file e successiva lettura
– read2 : Programma per la scrittura di dati una riga per volta
– print : Programma per la stampa della lunghezza di ogni linea presente in un file
– aggiungi_testo : Programma per aggiungere del testo ad un file
– aggiungi_testo2 : Programma per aggiungere del testo su più linee

Per scaricare i file cliccare sul link seguente:

Script contenuti nella Guida alla programmazione con R

Link utili:

Sito ufficiale del progetto R (Download del programma)
R Studio (Piattaforma Open Source per la programmazione in R)
The R Journal (Il giornale ufficiale del progetto consultabile gratuitamente)

Requisiti hardware di Rstudio

python

L’ambiente integrato Rstudio ci consente di avviare il calcolo al suo interno di modo da risultare completo; per fare questo però non richiede un grande sforzo in termini di potenza di calcolo da parte della macchina in uso. Dopo aver scaricato il software, per installare il programma sul nostro pc dovremo necessariamente conoscere i requisiti hardware di RStudio.

Ne deriva che i requisiti hardware richiesti per far funzionare RStudio sono minimi, quindi il numero di core, la velocità dei core e la quantità di ram di cui avremo bisogno dipenderà esclusivamente dalla mole di lavoro che l’analisi che stiamo eseguendo necessiterà. Ricordiamo a tal proposito che R è a thread singolo, e come tale, non potrà beneficiare di core aggiuntivi a meno che non si abbia familiarità con le varie librerie che ci consentono di parallelizzare il lavoro e sono quindi in grado di sfruttare più core.

Rstudio

Rstudio

Gli utenti alle prime armi nell’analisi dei dati, è improbabile che avvertano l’esigenza di un processore a più core, se non quelli attualmente installati sulle macchine in commercio e più di 1 gb di ram. Tuttavia, se si ha intenzione di analizzare insiemi di dati di grandi dimensioni (> 1gb) allora la macchina in uso avrà bisogno di una maggiore disponibilità di memoria ram. In generale, la maggior parte delle persone non sfruttano la parallelizzazione in R, e così risulta conveniente avere un processore con un minor numero di core che sono più veloci rispetto a quelli a più core.

Per approfondire l’argomento:

R studio

python

R studio è probabilmente l’unico ambiente di sviluppo sviluppato appositamente per R. È disponibile per tutte le principali piattaforme (Windows, Linux, e Mac OS X) e può essere eseguito su una macchina locale come il nostro computer o anche sul Web utilizzando rstudio Server. Con Rstudio Server è possibile fornire una interfaccia basata su browser (la cosiddetta IDE) a una versione R in esecuzione su un server Linux remoto.

R studio consente di integrare diverse funzionalità che sono estremamente utili, soprattutto se si utilizza R per progetti più complessi.

L’ambiente è composto di quattro diverse aree:

  1. Scripting area: in quest’area è possibile aprire, creare e scrivere i vostri script.
  2. Console area: questa zona è la console R effettiva in cui vengono eseguiti i comandi.
  3. Workspace/History area: in quest’area è possibile trovare una lista di tutti gli oggetti creati nello spazio di lavoro in cui si sta lavorando.
  4. Visualization area: in quest’area è possibile caricare facilmente i pacchetti e aprire file di aiuto R, ma anche cosa ancora più importante, è possibile visualizzare i grafici.
Rstudio

Rstudio

Per approfondire l’argomento:

Editor per script R

python

In questo post analizzeremo per quale motivo utilizzare gli editor per script R disponibili in rete. Per programmare con R, potremo utilizzare un editor di testo qualsiasi e una semplice interfaccia a riga di comando. Entrambi questi strumenti sono già presenti su qualsiasi sistema operativo, quindi volendo, potremo ignorare questo passaggio.

Editor per script in R

Editor per script in R

Questo perchè, quando un programmatore scrive un semplice programma, lo fa utilizzando il text editor blocco note di windows, questo perché per realizzare dei programmi i font, i colori e in generale l’aspetto grafico sono ininfluenti, anzi possono rendere il lavoro del programmatore più ostico.

È questo il motivo per cui negli ambienti di sviluppo del software non sono utilizzati programmi di videoscrittura complessi, programmi questi che invece sono largamente impiegati dagli scrittori, ma piuttosto degli editor di testo semplici (come notepad o blocco note in ambiente Windows oppure vi ed emacs in ambiente linux).

Tali editor, al posto di complicate opzioni per la gestione visuale del testo forniscono funzioni avanzate di trattamento del puro testo, quali ad esempio veloci procedure di spostamento all’interno del testo, ricerche e sostituzioni di parole all’interno del file e di file esterni, riconoscimento di parole chiave del linguaggio di programmazione con la possibilità di evidenziare le stesse colorandole in modo diverso dal resto del testo, ed infine la identazione del testo.

Per approfondire l’argomento:

Come creare uno script in R

python

Per creare uno script in R basterà utilizzare il menu File attraverso la seguente sequenza di comandi:

File => Nuovo script

Si aprirà in questo modo uno script vuoto, starà a noi adesso di popolarlo con del codice di sicuro valore. Una volta che avremo inserito alcuni comandi nella finestra dello script, sarà necessario mandarlo in esecuzione nella console. Naturalmente si può fare il copia-incolla, come al solito, ma è meglio risulta decisamente più rapido nonché più professionale selezionare con il mouse il codice che si intende eseguire e premere i tasti Ctrl + R. In alternativa, si può anche fare clic destro nella finestra e selezionare la voce Esegui linea o selezione.

Esecuzione di uno script

Esecuzione di uno script

Da questo esempio scaturisce una prima considerazione: digitare i comandi direttamente nella shell di R non è davvero la soluzione migliore. Un modo efficace di interagire con la shell è invece di creare uno script  in R . In questo metodo, si può scrivere il codice in una finestra separata e poi si sarà grado di eseguire il codice nella console, in modo che se si avverte l’esigenza di salvare il codice o di eseguirlo più volte non sarà necessario digitare nuovamente il tutto. 

 Per approfondire l’argomento:

La directory di lavoro in R

python

La directory di lavoro in R è fondamentalmente la posizione sul computer in cui R è in funzione. Ciò significa che in tale directory, R è in grado di leggere e scrivere file. È possibile identificare la directory di lavoro con l’aiuto del seguente comando:

getwd ()

È possibile impostare una nuova directory di lavoro attraverso l’utilizzo del comando:

setwd("dir")

dove “dir” è l’indirizzo della directory.

La directory di lavoro in R

La directory di lavoro in R

L’utilizzo di tale comando risulta particolarmente utile quando lo si utilizza all’interno di uno script, questo perché attraverso l’utilizzo della RGui sarà più facile cambiare la directory di lavoro con la seguente sequenza:

File => Cambia dir

Per approfondire l’argomento: