Creare funzioni personalizzate con R

Una delle cose che rendono R un sistema per l’analisi dei dati tanto potente e versatile è il suo essere a tutti gli effetti un linguaggio di programmazione. Quando siamo davanti a un problema al quale gli sviluppatori di R non hanno pensato (capita più spesso di quanto si possa credere), possiamo vestire noi stessi i panni dello sviluppatore e creare delle nuove funzioni R.

Come? Utilizzando l’apposito comando: function. Ecco come funziona:

fun <- function( argomenti ) { corpo }

Per creare una nuova funzione dobbiamo:

  1. Creare un nuovo oggetto (fun nell’esempio) che sarà il risultato delle operazioni eseguite tramite il comando function().
  2. Definire gli argomenti da passare in input alla funzione.
  3. Definire il corpo della funzione, ovvero tutte quelle operazioni da svolgere a partire dagli argomenti in input.
  4. Restituire un valore in output.

Proviamo a costruire una funzione per l’elevamento al quadrato di un valore x, che chiameremo “pow2”:


pow2 <- function(x) { x2 <- x^2 return(x2) } [/code]

La funzione prende un argomento, che abbiamo deciso di chiamare “x”; quando questa verrà lanciata, il valore x sarà elevato al quadrato e il risultato, salvato nel nuovo oggetto x2, verrà restituito in output dall’istruzione return. Si noti bene che:

  1. L’argomento x avrebbe potuto assumere qualsiasi altro nome, si tratta di una scelta dello sviluppatore.
  2. Tutto ciò che accade dentro la funzione, come la creazione del nuovo oggetto x2, resta dentro la funzione e, a meno di casi particolari, non andrà a intaccare gli oggetti contenuti nell’area di lavoro. Ogni funzione ha infatti un proprio ambiente dedicato.
  3. L’istruzione return() è opzionale.
  4. Se il corpo della funzione contiene un’unica riga di codice, allora le parentesi graffe possono essere omesse. Si faccia attenzione che, se più righe di codice vengono poste sequenzialmente utilizzando il punto e virgola, saranno comunque considerate come righe separate.

Eseguendo il codice descritto sopra, nell’area di lavoro verrà costruito un nuovo oggetto, pow2, di classe “function”, che potrà essere utilizzato al pari di tutte le altre funzioni di R:

> pow2(27)
[1] 729

Per rendere la funzione un po’ più completa, possiamo fare in modo che sia l’utente a decidere l’esponente dell’elevamento a potenza, fornendo comunque un valore di default alla funzione che, in mancanza di alcuna specificazione, eleverà x al quadrato:


pow <- function(x, exponent=2) { x.power <- x^exponent return(x.power) } [/code]

Rispetto alla precedente funzione, questa non richiede un argomento ma due, di cui uno però è opzionale.

> pow(27)
[1] 729
> pow(27,3)
[1] 19683

A differenza di altri linguaggi di programmazione, in R le funzioni possono restituire in output un unico oggetto. Se quindi abbiamo l’esigenza di ottenere più valori in output, dobbiamo ingegnarci sfruttando vettori, liste, matrici, e tutte quelle classi di oggetti che permettono l’inclusione di più valori all’inteno di un medesimo oggetto. La logica è che, dato che la funzione può restituire un unico oggetto, allora faremo in modo che sia l’oggetto stesso a contenere al suo interno più valori.

Proviamo a costruire una funzione che, dato un valore x, restituisce due valori: x elevato 2 e x elevato 3.


pow23 <- function(x) { x.power <- c(pow2 = x^2, pow3 = x^3) return(x.power) } [/code]

Questa volta, l’oggetto x.power, che la funzione restituisce in output, è un vettore di due elementi.

> pow23(27)
 pow2  pow3
  729 19683

Il modo migliore di utilizzare le funzioni è quello di archiviarle in script o pacchetti dedicati, che all’occorrenza possono essere richiamati; in questo modo, si possono velocizzare macchinose operazioni che capita di realizzare con una certa frequenza.

Print Friendly, PDF & Email
Print Friendly, PDF & Email

Lascia un commento