2013-08-02 6 views
5

Ho pensato che specifica lo spazio dei nomi ho dato R meno lavoro da fare, ma io sono probabilmente sbagliatoperché chiamare una funzione che specifica lo spazio dei nomi è più lento?

library(microbenchmark) 
> microbenchmark(unique.default(c(1,1:10)),base::unique.default(c(1,1:10))) 
Unit: microseconds 
          expr min  lq median  uq max neval 
     unique.default(c(1, 1:10)) 3.528 3.849 4.0095 4.170 12.509 100 
base::unique.default(c(1, 1:10)) 11.546 12.188 12.5090 12.829 59.012 100 
+4

qualcuno ha bisogno di sottolineare: questi sono microsecondi! Probabilmente insignificante se il tuo codice farà qualcosa di più complesso. – flodel

+0

@flodel nel 99,9% hai ragione. Ma ho un programma che ha molte chiamate di funzione, tutte in un grande loop. Sto per lanciare una nuova versione completamente vettoriale, grazie a data.table, ma è ancora in modalità dev, quindi nel frattempo un millisecondo salvato in ogni ciclo del ciclo è di pochi minuti in tutto il programma ... – Michele

+1

Se hai conflitti di nome ed è per questo che hai bisogno di '::', potresti fare 'my.unique <- base :: unique.default' e usare' my.unique'. – Roland

risposta

7

Il primo ottiene la funzione dall'ambiente pacchetto che si crea quando base è attaccato:

> "unique.default" %in% ls("package:base") 
[1] TRUE 

la seconda utilizza la funzione :: per ottenere la funzione dallo spazio dei nomi del pacchetto:

> `::` 
function (pkg, name) 
{ 
    pkg <- as.character(substitute(pkg)) 
    name <- as.character(substitute(name)) 
    getExportedValue(pkg, name) 
} 

Guarda quante chiamate di funzione ha bisogno.

Se è necessaria una funzione solo una volta potrebbe essere più efficiente ottenerla dallo spazio dei nomi. Ma se ne hai bisogno ripetutamente o hai bisogno di diverse funzioni da un pacchetto, dovresti allegare il pacchetto.

+1

Oppure utilizzare un pacchetto con un file dello spazio dei nomi. – hadley

Problemi correlati