2016-02-06 24 views
5

Tôi đang theo một hướng dẫn trong Rbloggers và tìm thấy việc sử dụng dấu hai chấm, tôi nhìn trực tuyến, nhưng tôi không thể tìm thấy lời giải thích cho việc sử dụng chúng. Đây là một ví dụ về việc sử dụng chúng.Các dấu hai chấm (:) trong R là gì?

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

Tôi hiểu nó tạo khung dữ liệu nhưng tôi không hiểu mục đích của chúng.

+6

xem các tập tin giúp đỡ ... '? '::'' – user20650

+2

Cảm ơn, tôi không biết làm thế nào để truy cập vào các nhân vật giúp đỡ trong R! –

+1

'help (" :: ")' cũng có thể được sử dụng nếu '?' Cho bạn những rắc rối. Các hàm luôn có thể được viết bằng dấu ngoặc kép. –

Trả lời

3

Có thể có nhiều hàm có cùng tên trong nhiều gói. Các nhà điều hành thư ruột kết đôi cho phép bạn chỉ định các chức năng cụ thể mà bạn muốn:

package::functionname 
10

Như bạn có thể đã nhìn lên các trang trợ giúp của bây giờ sử dụng :: giúp truy cập vào các chức năng chính xác từ đó gói cụ thể. Khi bạn tải dplyr bạn có thể nhận được tin nhắn như sau ..

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

Vì vậy, ví dụ, nếu bạn muốn sử dụng chức năng intersect từ dplyr hoặc gói cơ bản, bạn cần phải xác định bằng cách sử dụng dấu hai chấm :: đôi. Cách sử dụng sẽ như sau

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

Cập nhật: thêm giải trình bổ sung

Lưu ý: Trình tự bạn tải thư viện xác định việc tiếp cận ưu đãi của các chức năng cụ thể. Các nhà phát triển các gói khác nhau có xu hướng sử dụng cùng một tên hàm. Tuy nhiên, khi R gặp một hàm, nó chạy qua các thư viện khác nhau mà phiên cụ thể đã tải theo cách tuần tự. Bạn có thể kiểm tra các gói trong một phiên bằng cách chạy (.packages())

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

Như bạn có thể thấy trong phiên ví dụ của tôi ở trên, tidyr là thư viện cuối cùng tôi nạp, đó là phiên r nhập 1st. Vì vậy, khi bạn sử dụng bất kỳ chức năng nào trong mã của mình, trước tiên nó được tìm kiếm trong tidyr -> sau đó data.table -> sau đó dplyr và cứ tiếp tục như vậy, cuối cùng gói dịch vụ base được tra cứu. Vì vậy, trong quá trình này khi có tên hàm trùng lặp giữa các gói mà một trong đó nạp mặt nạ cuối cùng trước đó. Để tránh mặt nạ này, bạn chỉ định trong mã R để tìm hàm. Do đó, tại đây base::intersect, sẽ sử dụng hàm từ thư viện cơ sở thay vì dplyr. Ngoài ra, bạn có thể sử dụng để tránh tải thư viện hoàn chỉnh. Có tích cực và tiêu cực với điều này. Đọc các liên kết và tìm hiểu thêm.

chạy và kiểm tra sự khác biệt. Dưới đây là một số tài nguyên để bạn hiểu.

Compare library(), require(), ::

Namespace

Các vấn đề liên quan