R e il package masking – un esempio reale

by Silvia Bordogna

facebooktwittergoogle_pluspinterestlinkedintumblr

Molto spesso, nel nostro scrivere codice, dimentichiamo una parte fondamentale in R: la gestione errata di pacchetti simili può portare a errori nel nostro codice.

Quando si carica una libreria nel migliore dei casi la riga di comando viene eseguita senza darci troppa preoccupazione. Capita però che la console si popoli di warning rossi, che siamo portati ad ignorare soprattutto se la funzione che ci serve porta comunque ai risultati desiderati.

Prima o poi vi potrà capitare che tale comando dia un errore, nonostante abbiate verificato la correttezza di dati, parametri della funzione e quant’altro.

La ragione del problema sta proprio nel fatto che avete caricato dei pacchetti in conflitto, cioè che hanno uno o più nomi di funzione uguali, motivo per cui R non può usarli nello stesso tempo.

Vi riporto l’esempio in cui mi sono imbattuta lavorando su una applicazione shiny che richiama le seguenti librerie all’inizio del codice:

Il processo prende i dati da un Excel tramite una riga di comando simile a questa:

Successivamente l’App prevede il download dei risultati sempre in formato Excel con queste righe di codice:

 

Purtroppo lo script si bloccava e la console restituiva questo errore, che si riferisce evidentemente alla funzione  loadWorkbook(fname,create=TRUE) . L’errore era:

La ragione di quanto accaduto è legata al fatto che i pacchetti xlsx e XLConnect sono in conflitto tra loro, infatti se si presta attenzione al momento in cui vengono caricate le librerie, viene mostrato un messaggio che specifica quali nomi di funzioni sono condivisi dai due pacchetti.

 

La priorità va all’ultima libreria caricata, ovvero xlsx, che maschera i comandi di XLConnect e causa l’errore iniziale.
Una soluzione possibile è quella di caricare la libreria appena prima del codice che la utilizza, di modo da evitare di chiamare funzioni incompatibili con la sintassi di un pacchetto che non è quello “in vigore” in quel momento.

Altra soluzione è quella di utilizzare il comando “detach”. Un comando come “detach(“package:xlsx”, unload=TRUE)” può risolvere i nostri problemi una volta per tutte :)