2015-05-26 16 views
17

Tôi gặp sự cố với chức năng stats::lag khi sử dụng gói dplyr. Cụ thể, tôi nhận được kết quả khác với hàm lag trước và sau khi tải dplyr.Thay đổi hành vi của số liệu thống kê :: độ trễ khi tải gói dplyr

Ví dụ: đây là chuỗi thời gian mẫu. Nếu tôi tính toán độ trễ với k = -1, loạt tụt bắt đầu từ 1971.

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

## [1] 1971 

Bây giờ, nếu tôi tải dplyr, cuộc gọi cùng mang lại một loạt tụt bắt đầu từ năm 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 

Do các cảnh báo khi tải dplyr, tôi đoán là điều này phải làm với Môi trường. Tuy nhiên, tách ra dplyr dường như không giúp được gì.

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 

Mọi đề xuất đều được đánh giá cao. Giải pháp duy nhất của tôi cho đến thời điểm này là để khởi động lại phiên R giữa việc tính toán lag1lag2.

Dưới đây là phiên của tôi:

## 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) 

Tôi cũng đã thử unloadNamespace, theo đề nghị của @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 
+0

'detach' có thể không hoàn toàn hiệu quả. Tôi thường sử dụng 'unloadNamespace'. (Nhưng tôi chỉ cố gắng và nó không hiệu quả.) –

+0

Cảm ơn đề nghị. Tôi vẫn nhận được 'bắt đầu = 1970' mặc dù. Tuy nhiên, đã thêm tùy chọn này vào câu hỏi ở trên. –

+1

Vâng. Đồng ý điều này thật khó hiểu. 'getAnywhere (lag.default)' với các truy xuất được nạp dull: '2 đối tượng khác nhau khớp với 'lag.default' đã được tìm thấy ở những nơi sau đây phương pháp S3 đã đăng ký trễ từ không gian tên dplyr không gian tên: dplyr không gian tên: stats Sử dụng [ ] để xem một trong số đó'. Dường như dplyr đang ghi đè lag.default mà không đưa ra cảnh báo về nó. –

Trả lời

18

gói Các dplyr được hiệu quả ghi đè 'lag'. Cơ chế gửi không tìm thấy lag vì thực sự không có chức năng theo tên đó, chỉ cần hai bản sao của lag.default, một trong 'số liệu thống kê' và một trong 'dplyr' và bản sao 'dplyr' được tìm thấy trước tiên. Bạn có thể buộc các phiên bản số liệu thống kê để được tìm thấy với việc sử dụng các ::: -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 

Các dplyr:::lag.default không sử dụng chuỗi thời gian chức năng cụ thể. Tôi không thể giải thích tại sao unloadNamespace thất bại trong việc loại bỏ định nghĩa của chức năng nhưng nó vẫn còn đó:

> 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 

Tiếp tục weirdness: Sau khi dỡ các dply -namespace Tôi thấy điều này:

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

(Và sau đó khởi động và tải dplyr, tôi thấy như vậy rõ ràng kép)

Ngoài ra còn có một cái gì đó kỳ lạ về trang trợ giúp cho 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! 

Nhìn vào github (sau khi xác định rằng tôi đã có phiên bản mới nhất của dplyr trên CRAN), tôi thấy rằng đây là một vấn đề cho quá trình R CMD check: https://github.com/hadley/dplyr/commit/f8a46e030b7b899900f2091f41071619d0a46288. Rõ ràng lag.default sẽ không bị ghi đè trong các phiên bản sau, nhưng lag sẽ che dấu phiên bản thống kê. Tôi tự hỏi điều gì sẽ xảy ra với lag.zoolag.zooreg. Có lẽ nó cũng sẽ thông báo rằng over-writing hoặc masking khi gói được nạp?

+0

Điều đó xảy ra! cảm ơn rất nhiều về sự giúp đỡ của bạn. –

+1

FYI, gần đây tôi đã gặp sự cố này với gói 'zoo'. Thật thú vị, khi tôi tải 'dplyr' sau khi' zoo' thì 'lag.zoo' xuất hiện để che dấu mặc dù KHÔNG có cảnh báo. Công việc của 42-is vẫn hợp lệ, tức là 'zoo ::: lag.zoo (x, n)'. –

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