2014-06-13 20 views
38

Nếu tôi nạp MASS gói:dplyr :: chọn xung đột chức năng với MASS :: chọn

library(MASS) 

sau đó tải cố gắng chạy dplyr::select, tôi nhận được một lỗi:

library(dplyr) 
mtcars %.% 
select(mpg) 

# Error in select(`__prev`, mpg) : unused argument (mpg) 

Làm thế nào tôi có thể sử dụng dplyr::select với gói MASS được tải?

+4

Bạn có thể sử dụng nó như bạn chỉ cần viết: 'dplyr :: chọn (mpg)' –

Trả lời

40

Như Pascal nói, sau đây làm việc

require(MASS) 
require(dplyr) 
mtcars %>% 
    dplyr::select(mpg) 
+17

Nếu bạn chắc chắn bạn sẽ nạp MASS và dplyr với nhau rất thường xuyên và sử dụng 'chọn' rất nhiều, bạn có thể thực hiện lại chức năng: chọn <- dplyr :: select có thể giúp lưu gõ 'dplyr ::' nhiều lần – KFB

+1

Tôi biết điều này là cũ nhưng dù sao đi nữa. Chỉ gặp phải vấn đề tương tự. Và dường như MASS được nhập khẩu (trong số những người khác) bởi ggplot2 vì vậy tôi đoán nhiều người có khả năng sử dụng chúng cùng nhau. Mặc dù tôi tin rằng tôi đã sử dụng ggplot2 và dplyr mà không có vấn đề trước đây ... – Latrunculia

+0

Tôi có một vấn đề tương tự. Tuy nhiên, điều kỳ lạ là vấn đề này đã không xảy ra cho đến ngày hôm nay, và tôi đã không thực sự thay đổi mã của tôi. Tôi chỉ cắm phần gây lỗi vào điều kiện 'if (x == x) {...}'. Bất kỳ ý tưởng nào tại sao lỗi này đột nhiên xuất hiện, trước đây không có vấn đề gì? – deca

12

Điều này xảy ra với tôi thường xuyên hơn tôi nên thừa nhận. dplyr va chạm với MASS::select, plyr::summarisestats::filter trong số những thứ khác, đặc biệt là khi tải các gói tải một trong những thư viện đó qua thư viện (chúng không nên, nhưng một số vẫn làm) hoặc khi bạn tải dplyr trong .Rprofile (không!). Và nó có thể dẫn đến các vấn đề khá mơ hồ, không phải lúc nào cũng là một thông báo lỗi, đặc biệt là xung đột với plyr.

Tôi chỉ mới biết về chức năng conflicts(). Điều này hữu ích, nhưng xung đột "quá báo cáo" khi hai gói có chức năng giống hệt nhau, ví dụ: tidyr :: %>% và dplyr :: %>%.

Vì vậy, tôi đã viết a function để cho tôi biết nếu tôi phát điên hoặc liệu có thực sự xung đột gây ra lỗi hiện tại hay không. Nó không chỉ kiểm tra các xung đột, nó sẽ kiểm tra xem một gói mong muốn nhất định có phải là gói "trên đầu" hay không và liệu các cơ quan của hàm có thực sự khác nhau hay không.

Nó thực hiện điều này cho dplyr theo mặc định, nhưng bạn có thể chỉ định một gói khác sử dụng tham số want_package. Ví dụ, tôi thường bị vấp bởi recodealpha, được sử dụng lại trong nhiều gói.

Cách sử dụng đơn giản: amigoingmad().

Theo mặc định, nó cũng sẽ tự động "sửa chữa" những điều nếu dplyr không phải là "trên", sử dụng các lệnh sau:

detach("package:dplyr", character.only = TRUE) 
library("dplyr", character.only = TRUE) 

Lưu ý rằng chức năng sẽ báo cáo nếu một chức năng người dùng chỉ định là chặn dplyr, nhưng không sửa lỗi này một cách tự động vì mục đích an toàn (chỉ cần xóa hàm trong trường hợp đó).

Hiện tại, giải pháp này không gây ra bất kỳ sự cố nào cho tôi. Tất nhiên tôi sẽ không biện hộ bằng cách sử dụng điều này trong mã sản xuất, nhưng khi bạn đang gỡ lỗi một .Rmd -file và có thể đã làm rối trật tự tải do tai nạn đó là một cách nhanh chóng để tìm hiểu.

Nếu bạn muốn điều này trong một gói:

devtools::install_github("rubenarslan/formr") 
+1

Đẹp. Tôi nghĩ rằng tôi đã phát điên. – nigelhenry

3

Nếu bạn tải đầu tiên các MASS thư viện và thứ hai các dplyr một

library (MASS) 
library (dplyr) 

sau đó phiên bản đầu tiên của select chức năng trong phiên của bạn searchpaths() sẽ là một trong thư viện dplyr.

Do đó

select(mtcars, mpg) 

sẽ làm việc như

dplyr::select(mtcars, mpg) 
Các vấn đề liên quan