2016-02-06 36 views
5

Podążam za tutorialem w Rbloggers i znalazłem zastosowanie podwójnych dwukropków, szukałem w Internecie, ale nie mogłem znaleźć wytłumaczenia ich użycia. Oto przykład ich użycia.Jakie są podwójne dwukropki (: :) w R?

df <- dplyr::data_frame(
    year = c(2015, NA, NA, NA), 
    trt = c("A", NA, "B", NA) 
) 

Rozumiem, że tworzy ramkę danych, ale nie rozumiem ich przeznaczenia.

+6

zobaczyć pliki pomocy ... '? '::'' – user20650

+2

Dzięki, nie wiedziałem, jak uzyskać dostęp do znaków pomóc w R! –

+1

'help (" :: ")' może być również użyty, jeśli '?' Powoduje problemy. Funkcje zawsze można zapisać w cudzysłowach. –

Odpowiedz

3

Może istnieć wiele funkcji o tej samej nazwie w wielu pakietach. Operator podwójny dwukropek pozwala określić konkretną funkcję, którą chcesz:

package::functionname 
10

Jak zapewne spojrzał na stronie pomocy już wykorzystanie :: ułatwia dostęp do dokładnej funkcji z tego konkretnego pakietu. Podczas ładowania dplyr prawdopodobnie dostał wiadomość następująco ..

The following objects are masked from ‘package:base’: 
     intersect, setdiff, setequal, union 

Tak więc, na przykład, jeśli chcesz korzystać z funkcji intersect dplyr lub pakietu podstawowego, należy określić przy użyciu :: podwójne dwukropki. Wykorzystanie będzie następująca

mtcars$model <- rownames(mtcars) 
first <- mtcars[1:20, ] 
second <- mtcars[10:20, ] 
dplyr::intersect(first, second) 
base::intersect(first, second) 

Aktualizacja: Dodano dodatkowe wyjaśnienie

Uwaga: Sekwencja załadować biblioteki ustalenia preferencyjnego dostępu do konkretnych funkcji. Twórcy różnych pakietów mają tendencję do używania tych samych nazw funkcji. Jednakże, gdy R napotka funkcję, przechodzi przez różne biblioteki, które konkretna sesja ładowała sekwencyjnie. Można sprawdzić pakiety w sesji uruchamiając (.packages())

[1] "tidyr"  "data.table" "dplyr"  "stats"  
[5] "graphics" "grDevices" "utils"  "datasets" 
[9] "methods" "base"  

Jak widać na moim przykładzie sesji powyżej tidyr jest ostatni biblioteki I załadowany, która jest sesja r 1-ty wpis. Tak więc, gdy użyjesz jakiejkolwiek funkcji w kodzie, najpierw jest ona przeszukiwana w tidyr -> następnie data.table -> następnie dplyr itd., Wreszcie pakiet base jest sprawdzany. Tak więc w tym procesie, gdy nazwa funkcji nakłada się na siebie, ta, która ładowała ostatnią, maskuje poprzednie. Aby uniknąć tego maskowania, w kodzie R należy określić, gdzie szukać tej funkcji. Stąd, tutaj base::intersect, użyje funkcji z biblioteki bazowej zamiast z dplyr. Możesz też użyć, aby uniknąć ładowania pełnej biblioteki. Są w tym pozytywne i negatywne. Przeczytaj linki i dowiedz się więcej.

uruchom i sprawdź różnice. Oto kilka zasobów, aby uzyskać zrozumienie.

Compare library(), require(), ::

Namespace