2015-06-23 15 views
7

Tôi đã tìm kiếm tốt nhất có thể cho một cái gì đó liên quan đến điều này nhưng không tìm thấy bất cứ điều gì trên SO hoặc dplyr github; có thể một vấn đề mới như mã dưới đây đã làm việc tốt trước ngày hôm nay?Kết hợp dplyr :: mutate với lubridate :: ymd_hms trong R ngẫu nhiên gây ra segfault

Vấn đề đơn giản về mặt khái niệm: gọi số my_data %>% mutate(x = ymd_hms(x)) đôi khi, nhưng không phải lúc nào (ví dụ: ngẫu nhiên), khiến R gặp sự cố với phân đoạn bị bắt. Tôi đã giảm được vấn đề với hình thức đơn giản nhất tôi có thể (cũng ở đây: https://gist.github.com/john-sandall/05c3abb24fc738ddc2ad):

require(lubridate) 
require(dplyr) 

set.seed(42) 
make_some_random_datetimes = function(n) ymd("2015-01-01") + seconds(runif(n, min=0, max=60*60*24*365)) 

d = data.frame(
    col1 = make_some_random_datetimes(5000), 
    col2 = make_some_random_datetimes(5000) 
) 

do_it = function() { 
    d %>% mutate(
    col1 = ymd_hms(col1), 
    col2 = ymd_hms(col2) # for some reason, it only crashes when evaluating 2+ cols, if we removed this line it'd be fine 
) 
    return(TRUE) 
} 

do_it() # doesn't crash every time...it fails every nth time where n is randomly distributed with mean of roughly 7.7 

do_it_lots_of_times = function(n) for (i in 1:n) do_it() 

do_it_lots_of_times(50) # almost guaranteed to fail on my machine 

Vì vậy, tại một số điểm, chạy do_it() trên gây ra một segfault, sản lượng chạy R trong Terminal

*** caught segfault *** 
address 0x0, cause 'unknown' 

Tôi đã nâng cấp lên phiên bản R 3.2.1 sáng nay, mặc dù quay trở lại 3.2.0 và các thư viện cài đặt lại không có tác dụng. Sau đó, tôi đã thử gỡ cài đặt/cài đặt lại R (sử dụng brew install r với homebrew được cập nhật/nâng cấp đầy đủ) và sau đó cài đặt lại tất cả các gói bắt buộc ở trên. Dưới đây là kết quả của sessionInfo():

R version 3.2.1 (2015-06-18) 
Platform: x86_64-apple-darwin14.3.0 (64-bit) 
Running under: OS X 10.10.3 (Yosemite) 

locale: 
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] dplyr_0.4.2  lubridate_1.3.3 

loaded via a namespace (and not attached): 
[1] lazyeval_0.1.10 R6_2.0.1  assertthat_0.1 magrittr_1.5 plyr_1.8.3  parallel_3.2.1 
[7] DBI_0.3.1  tools_3.2.1  memoise_0.2.1 Rcpp_0.11.6  stringi_0.5-2 digest_0.6.8 
[13] stringr_1.0.0 

Là một nhà thống kê và cạn kiệt ý tưởng, tôi quyết định nhìn vào sự phân bố của các tỷ lệ thất bại, xem nếu có thể giúp làm sáng tỏ. Nếu chạy do_it() treo trên vào thời gian thứ n, và tôi đã viết xuống trong đó n rơi cho 50 tai nạn (ví dụ như lần thử thứ 3, sau đó 7 thử), tôi nhận được chuỗi này:

3, 7, 9, 20, 9, 9, 9, 7, 4, 23, 6, 3, 3, 3, 7, 7, 3, 9, 6, 6, 7, 10, 13, 7, 3, 7, 4, 7, 9, 6, 7, 7, 6, 6, 7, 7, 7, 9, 6, 12, 7, 7, 5, 9, 18, 6, 7, 9, 9, 7 

nào mang lại cho tôi phân phối này:

tôi không biết nếu đó là có liên quan hoặc giúp chút nào, mặc dù điều khác tôi nhận thấy là tăng số lượng hàng trong dataframe d 5.000-10.000 dường như để tăng giá trị trung bình của n từ ~ 8 đến ~ 20.

Bất kỳ trợ giúp nào về điều này sẽ cực kỳ được hoan nghênh!

+1

Rất có thể liên quan đến điều này: https://github.com/hadley/dplyr/issues/1231 –

+0

Xác nhận trên windows, mới nhất 64bit R, không phải phiên bản rstudio mới nhất. dplyr_0.4.2 lubridate_1.3.3 Sự cố * mọi lúc * Thật lạ lùng là không ghi tập tin nhật ký rstudio –

Trả lời

6

90% chắc chắn đây là một lỗi trong phiên bản mới nhất của dplyr (0.4.2), xem vấn đề này ở đây: https://github.com/hadley/dplyr/issues/1231

hạ cấp phiên bản của tôi về dplyr để 0.4.1 như sau sửa chữa vấn đề này:

packageurl = "http://cran.r-project.org/src/contrib/Archive/dplyr/dplyr_0.4.1.tar.gz" 
install.packages(packageurl, repos=NULL, type="source", dependencies = TRUE) 
+0

Không làm hỏng tôi, n = 1000, 'RStudio 0.98.1062. dplyr_0.4.0, lubridate_1.3.3' 0.4.2 có vẻ giống như vấn đề. – Vlo

+0

Không làm hỏng tôi, n = 1000, dplyr_0.4.1 – jeremycg

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