Подтвердить что ты не робот

Изменение поведения статистики:: отставание при загрузке пакета dplyr

У меня возникают проблемы с функцией stats::lag при использовании dplyr. В частности, я получаю разные результаты от отставания функция до и после загрузки dplyr.

Например, здесь приведен пример временного ряда. Если я вычислил задержку с k = -1, отсталая серия начинается в 1971 году.

data <- ts(1:10, start = 1970, frequency = 1)
lag1 <- stats::lag(data, k = -1)
start(lag1)[1]

## [1] 1971

Теперь, если я загружаю dplyr, один и тот же вызов дает отсталую серию, начиная с 1970.

library(dplyr)

## 
## Attaching package: 'dplyr'
## 
## The following object is masked from 'package:stats':
## 
##     filter
## 
## The following objects are masked from 'package:base':
## 
##     intersect, setdiff, setequal, union

lag2 <- stats::lag(data, k = -1)
start(lag2)[1]

## [1] 1970

start(lag1)[1] == start(lag2)[1]

## [1] FALSE

Учитывая предупреждения при загрузке dplyr, я предполагаю, что это необходимо сделать с окружающей средой. Но отключение dplyr, похоже, не помогает.

detach("package:dplyr", unload = TRUE, character.only = TRUE)
lag3 <- stats::lag(data, k = -1)
start(lag3)[1]

## [1] 1970

start(lag1)[1] == start(lag3)[1]

## [1] FALSE

Любые предложения приветствуются. Мое единственное решение до сих пор перезапустите сеанс R между вычислением lag1 и lag2.

Здесь моя сессия:

##  setting  value                       
##  version  R version 3.2.0 (2015-04-16)
##  system   i386, mingw32               
##  ui       RTerm                       
##  language (EN)                        
##  collate  English_Canada.1252         
##  tz       America/New_York            
## 
##  package    * version  date       source        
##  assertthat   0.1      2013-12-06 CRAN (R 3.2.0)
##  bitops       1.0-6    2013-08-17 CRAN (R 3.2.0)
##  DBI          0.3.1    2014-09-24 CRAN (R 3.2.0)
##  devtools     1.8.0    2015-05-09 CRAN (R 3.2.0)
##  digest       0.6.8    2014-12-31 CRAN (R 3.2.0)
##  dplyr        0.4.1    2015-01-14 CRAN (R 3.2.0)
##  evaluate     0.7      2015-04-21 CRAN (R 3.2.0)
##  formatR      1.2      2015-04-21 CRAN (R 3.2.0)
##  git2r        0.10.1   2015-05-07 CRAN (R 3.2.0)
##  htmltools    0.2.6    2014-09-08 CRAN (R 3.2.0)
##  httr       * 0.6.1    2015-01-01 CRAN (R 3.2.0)
##  knitr        1.10.5   2015-05-06 CRAN (R 3.2.0)
##  magrittr     1.5      2014-11-22 CRAN (R 3.2.0)
##  memoise      0.2.1    2014-04-22 CRAN (R 3.2.0)
##  Rcpp         0.11.6   2015-05-01 CRAN (R 3.2.0)
##  RCurl        1.95-4.6 2015-04-24 CRAN (R 3.2.0)
##  rmarkdown    0.6.1    2015-05-07 CRAN (R 3.2.0)
##  rversions    1.0.0    2015-04-22 CRAN (R 3.2.0)
##  stringi      0.4-1    2014-12-14 CRAN (R 3.2.0)
##  stringr      1.0.0    2015-04-30 CRAN (R 3.2.0)
##  XML          3.98-1.1 2013-06-20 CRAN (R 3.2.0)
##  yaml         2.1.13   2014-06-12 CRAN (R 3.2.0)

Я также пробовал unloadNamespace, как было предложено @BondedDust:

unloadNamespace("dplyr")  
lag4 <- stats::lag(data, k = -1)  

## Warning: namespace 'dplyr' is not available and has been replaced  
## by .GlobalEnv when processing object 'sep'  

start(lag4)[1]  

## [1] 1970  

start(lag1)[1] == start(lag4)[1]  

## [1] FALSE
4b9b3361

Ответ 1

Пакет dplyr эффективно перезаписывает "отставание". Механизм отправки не находит lag, потому что на самом деле нет функции с таким именем, сначала обнаруживаются две копии lag.default, одна в "статистике" и одна в "dplyr", а первая копия "dplyr". Вы можете заставить версию статистики найти с помощью ::: -mechanism:

> lag2 <- stats::lag.default(data, k = -1)
Error: 'lag.default' is not an exported object from 'namespace:stats'

> lag2 <- stats:::lag.default(data, k = -1)
> stats::start(lag2)[1]
[1] 1971

dplyr:::lag.default не использует специальные функции временного ряда. Я не могу объяснить, почему unloadNamespace не может удалить определение функции, но оно все еще существует:

> unloadNamespace("dplyr")
> getAnywhere(lag.default)
2 differing objects matching ‘lag.default’ were found
in the following places
  registered S3 method for lag from namespace dplyr
  namespace:stats
Use [] to view one of them

Дальнейшая странность: после разгрузки dply -namespace я вижу следующее:

> environment(getAnywhere(lag.default)[1])
<environment: namespace:dplyr>
> environment(getAnywhere(lag.default)[2])
<environment: namespace:dplyr>
> environment(getAnywhere(lag.default)[3])
<environment: namespace:stats>

(И затем перезагрузка и загрузка dplyr, я вижу тот же очевидный двойной ввод.)

Там также что-то странное о странице справки для dplyr::lag:

> help(lag,pac=dplyr)
No documentation for ‘lag’ in specified packages and libraries:
you could try ‘??lag’
> help(`lag`,pac=`dplyr`)
No documentation for ‘lag’ in specified packages and libraries:
you could try ‘??lag’
> help(`lag.default`,pac=`dplyr`)  # This finally succeeds!

Глядя на github (после определения того, что у меня была последняя версия dplyr на CRAN), я вижу, что это было проблемой для процесса R CMD check: https://github.com/hadley/dplyr/commit/f8a46e030b7b899900f2091f41071619d0a46288. По-видимому, lag.default не будет переписан в будущих версиях, но lag замаскирует статистику. Интересно, что происходит с lag.zoo и lag.zooreg. Может быть, он также объявит, что переписывание или маскирование при загрузке пакета?