Nice programing

dplyr :: select 함수는 MASS :: select와 충돌합니다.

nicepro 2020. 12. 8. 20:00
반응형

dplyr :: select 함수는 MASS :: select와 충돌합니다.


MASS패키지를 로드하는 경우 :

library(MASS)

그런 다음로드 시도를 실행 dplyr::select하면 오류가 발생합니다.

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

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

어떻게 사용할 수 있습니다 dplyr::selectMASS패키지로드?


Pascal이 말했듯이 다음 작품은

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

이것은 내가 인정해야 할 것보다 더 자주 발생합니다. dplyr와 충돌 MASS::select, plyr::summarise그리고 stats::filter다른 것들 사이에, 특히 어떤로드 라이브러리를 통해 이러한 라이브러리 중 하나를로드 패키지 (그들은 안하지만, 일부는 아직도) 당신의 당신이 dplyr로드 할 때 또는 .Rprofile(하지!). 그리고 항상 오류 메시지가 아닌 매우 모호한 문제, 특히 plyr.

나는 최근에야 그 conflicts()기능 에 대해 배웠습니다 . 유용하지만 두 패키지가 동일한 기능 (예 : tidyr :: %>%및 dplyr ::)을 가질 때 "과도하게보고"충돌이 발생합니다 %>%.

그래서 나는 내가 화가 났는지 또는 현재 버그를 일으키는 충돌이 실제로 있는지 알려주 는 함수작성 했습니다 . 충돌 여부를 확인할뿐만 아니라 원하는 특정 패키지가 "위에"있는지 여부와 함수의 본문이 실제로 다른지 여부를 확인합니다.

기본적으로 dplyr에 대해이 작업을 수행하지만 want_package매개 변수를 사용하여 다른 패키지를 지정할 수 있습니다 . 예를 들어, 나는 종종 많은 패키지에서 재사용 되는 recodealpha의해 걸려 넘어집니다 .

사용법은 간단 amigoingmad()합니다..

기본적으로 다음 명령을 사용하여 dplyr이 "상단"이 아닌 경우 자동으로 "수정"합니다.

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

함수는 사용자 지정 함수가 dplyr을 차단하는지보고하지만 안전을 위해 자동으로 수정하지는 않습니다 (이 경우 함수를 제거하기 만하면됩니다).

아직까지이 솔루션은 나에게 문제를 일으키지 않았습니다. 물론 프로덕션 코드에서 이것을 사용하는 것을 옹호하지는 않겠지 만, .Rmd-file을 디버깅 할 때 실수로로드 순서를 엉망으로 만들었을 때 빠르게 알아낼 수있는 방법입니다.

패키지에 이것을 원한다면 :

devtools::install_github("rubenarslan/formr")

당신은로드하면 첫째MASS 라이브러리와 두 번째dplyr 하나를

library (MASS)
library (dplyr)

select세션 에있는 함수 의 첫 번째 버전 searchpaths ()dplyr라이브러리에있는 것입니다.

그 후

select(mtcars, mpg)

다음과 같이 작동합니다.

dplyr::select(mtcars, mpg)

위의 KFB의 의견과 마찬가지로 내가 찾은 간단한 해결책은 (1) 패키지를로드하고, (2) 순서에 대해 걱정하지 마십시오 (종속성 때문에 어려울 수 있음), (3) 어느 패키지 에든 우선 순위를 할당하는 것입니다. d는 네임 스페이스를 "소유"하는 것을 선호합니다.

select <- dplyr::select
filter <- dplyr::filter

예를 들어 environment: namespace아래에서 어떻게 변경 되는지 확인 하세요.

library(MASS)
select

  function (obj) 
  UseMethod("select")
  <bytecode: 0x7fbe822811b8>
  <environment: namespace:MASS>

select <- dplyr::select
select

  function (.data, ...) 
  {
      UseMethod("select")
  }
  <bytecode: 0x7fbe7c4a2f08>
  <environment: namespace:dplyr>

우아한 해결책은 다음과 같은 conflicted패키지 를 사용하는 것 입니다.

  • 네임 스페이스 충돌이 발생하면 유익한 오류 메시지를 생성합니다.
  • 네임 스페이스 우선 순위를 할당하는 명시 적 기능을 제공합니다.

https://github.com/r-lib/conflicted 에서 부분적으로 아래 예제 코드를 참조하십시오.

# install.packages("devtools")
devtools::install_github("r-lib/conflicted")

library(conflicted)
library(dplyr)

# example of informative error message
filter(mtcars, cyl == 8)
#> Error: [conflicted] `filter` found in 2 packages.
#> Either pick the one you want with `::` 
#> * dplyr::filter
#> * stats::filter
#> Or declare a preference with `conflicted_prefer()`
#> * conflict_prefer("filter", "dplyr")
#> * conflict_prefer("filter", "stats")

# example of assigning priority with conflict_prefer function
conflict_prefer("filter", "dplyr")

filter(mtcars, cyl == 8) %>% head(2)
#    mpg cyl  disp  hp drat   wt  qsec vs am gear carb
# 1 18.7   8 360.0 175 3.15 3.44 17.02  0  0    3    2
# 2 14.3   8 360.0 245 3.21 3.57 15.84  0  0    3    4

참고URL : https://stackoverflow.com/questions/24202120/dplyrselect-function-clashes-with-massselect

반응형