2013-08-02 7 views
5

Myślałem, że określenie nazw dałem R mniej pracy do zrobienia, ale jestem chyba źledlaczego wywoływanie funkcji określającej obszar nazw jest wolniejsze?

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

Ktoś musiał wskazać: to są mikrosekundy! Prawdopodobnie nieistotne, jeśli twój kod będzie robił coś bardziej złożonego. – flodel

+0

@flodel w 99,9% masz rację. Ale mam program, który ma wiele wywołań funkcji, wszystkie zgrupowane w dużej pętli. Mam zamiar wprowadzić nową wersję całkowicie wektoryzowaną, dzięki data.table, ale wciąż jest w trybie deweloperskim, więc w międzyczasie milisekunda zapisana w każdym cyklu pętli jest o kilka minut mniejsza w całym programie ... – Michele

+1

Jeśli masz konflikty nazw i dlatego potrzebujesz '::', możesz zrobić 'my.unique <- base :: unique.default' i użyć' my.unique'. – Roland

Odpowiedz

7

Pierwszy dostaje funkcję z otoczenia pakietu, który jest tworzony po podłączeniu base:

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

drugi zastosowania funkcjonować :: aby uzyskać funkcję z nazw pakiet:

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

Sprawdź, ile połączeń funkcji potrzebuje.

Jeśli potrzebujesz funkcji tylko raz, może być bardziej wydajne, aby uzyskać ją z obszaru nazw. Ale jeśli potrzebujesz go wielokrotnie lub potrzebujesz kilku funkcji z paczki, powinieneś załączyć paczkę.

+1

Lub użyj pakietu z plikiem przestrzeni nazw. – hadley

Powiązane problemy