2015-11-14 5 views
17

Sono stato un utente attivo R per diversi anni e qualcosa mi ha sempre confuso. Per installare pacchetti (es dplyr), si deve specificare il nome del pacchetto come stringa cioèSintassi per il caricamento e l'installazione di librerie.

install.packages("dplyr") 

Anziché

install.packages(dplyr) 

Questo ha senso per me, poiché "dplyr" passerebbe come nome il pacchetto e non come un oggetto, che sarebbe implicito da dplyr senza le virgolette.

Tuttavia, quando andiamo a caricare la libreria, passano sia la versione di stringa che di oggetto e caricano il pacchetto. Entrambi i seguenti caricare correttamente il pacchetto:

library("dplyr") 
detach("package:dplyr", unload=TRUE) 
library(dplyr) 

Non v'è alcun oggetto denominato dplyr nel mio lavoro, e non capisco il motivo per cui queste due funzioni base avrebbero sintassi diversa. Inoltre, non capisco perché la versione senza le virgolette non valuti valutare l'oggetto. Ad esempio

dplyr <- "mada" 
install.packages(dplyr) 
library(dplyr) 

Quanto sopra installamada, ma carichidplyr, anche se dplyr è un oggetto che restituisce "mada". Nota che sto lavorando su RStudio v.0.99.467 su Mac OS 10.10.4, se questo è importante. C'è una ragione per questo, o è semplicemente che le funzioni funzionano in modo diverso?

+5

È fondamentalmente un incidente storico. –

risposta

12

library la funzione accetta il pacchetto name come primo argomento. Questo name si riferisce effettivamente al nome passato come argomento del pacchetto piuttosto che qualsiasi valore associato a tale nome. La funzione library converte internamente l'argomento del pacchetto in un carattere letterale (tranne quando character.only è impostato su TRUE).

Quindi,

plyr <- "dplyr" 
library(plyr) 

subirà

if(!character.only) 
    package <- as.character(substitute(plyr)) 

per diventare

package <- "plyr" 

install.packages prende un vettore carattere come nome (s) di pacchetti da installare.

dd <- "plyr" 
install.packages(dd) 

Questo installerebbe plyr.

È perché install.packages non eseguire alcuna conversione con l'argomento pkgs. Quindi install.packages installa ciò che pkgs fa riferimento a.

4

Se si desidera caricare mada invece di dplyr nel tuo esempio, provare a utilizzare l'opzione character.only = TRUE

dplyr <- "mada" 
install.packages(dplyr) 
library(dplyr, character.only=TRUE) 

consultare la documentazione ?library per ulteriori informazioni.

+0

+1 Grazie, questo è molto utile. Tuttavia, stavo chiedendo di più per una spiegazione del perché questo si verifica piuttosto che una soluzione alternativa. Puoi commentare perché il valore predefinito sarebbe 'character.only = F'? Terrò la domanda aperta ancora per un po '. –

7

Se si guarda attraverso il codice sorgente per ?library si vedrà in line 230 click here:

if (!character.only) 
      package <- as.character(substitute(package)) 

Il nome del pacchetto che l'utente fornisce è costretto a carattere poi concatenati:

pkgname <- paste("package", package, sep = ":") 

Questo è ciò che consente l'input senza virgolette per la libreria. install.packages non ha la stessa funzionalità.

+3

Grazie, questa è sicuramente la risposta giusta. Ho accettato la risposta di Narendra perché sembra che sia un nuovo utente che ha bisogno di un rappresentante e ha anche avuto la risposta corretta con una buona spiegazione. Spero che vada bene per te, e grazie per il tuo aiuto (di nuovo). –

+1

@ChrisC Non sono d'accordo. Devi accettare la risposta migliore e non accettare un'altra risposta perché ti dispiace per l'altro utente.Per la comunità è il migliore che la migliore risposta sia accettata. – Jaap

+0

@ Jaap Grazie per l'input. In quel caso, pensavo che entrambe le risposte fossero ugualmente corrette, sebbene Narendra fosse più comprensibile e completa, e quindi avrei accettato la risposta allo stesso modo. –

7

Non capisco perché queste due funzioni di base abbiano una sintassi diversa.

È difficile speculare sui motivi per le specifiche decisioni di progettazione del linguaggio. La decisione di consentire nomi non quotati per la chiamata library è stata criticata da molti importanti programmatori R come illogici, incoerenti e non necessari, ma eccoci qui.

Oltre la tesi secondo cui è (leggermente) più conveniente di non digitare le virgolette, un altro motivo potenziale è somiglianza con altre lingue: per esempio, in Python si import librerie specificando il loro nome in questo modo: import lib_name, nonimport 'lib_name' . Ciò incoraggia gli scrittori di librerie a scegliere i nomi di librerie che sono identificatori validi nella lingua (in Python, le librerie caricate sono oggetti a cui è necessario fare riferimento). Questo è meno rilevante in R, dove raramente si fa riferimento alla libreria oltre a caricarla.

anche io non capisco perché la versione senza le virgolette non valuterebbe l'oggetto.

Perché R consente non-standard evaluation. In particolare, gli argomenti della funzione vengono valutati solo quando essi sono indicati, non prima:

f = function (arg) {} 
f(stop('this won’t raise an error!')) 

arg viene mai utilizzata, quindi mai valutati.

Nel caso di library, l'argomento non viene valutato neanche. Invece, è utilizzato in forma non valutata tramite substitute(package).

Problemi correlati