2015-06-23 9 views
7

Ho cercato nel miglior modo possibile per qualcosa relativo a questo ma non ho trovato nulla su SO o dplyr github; forse un nuovo problema come il codice qui sotto ha funzionato bene prima di oggi?Combinare dplyr :: mutate con lubridate: ymd_hms in R causa in modo casuale segfault

Il problema è concettualmente semplice: chiamata my_data %>% mutate(x = ymd_hms(x)) volte, ma non sempre (cioè a caso), provoca R per bloccarsi con un segfault catturato. Ho ridotto il problema per la forma più semplice che posso (anche qui: 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 

Così ad un certo punto, in esecuzione do_it() sopra provoca un segfault, uscita R in esecuzione in Terminal è

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

Questa mattina sono passato a R versione 3.2.1, anche se tornare alla versione 3.2.0 e reinstallare le librerie non è d'aiuto. Ho quindi provato a disinstallare/re-installare R (usando brew install r con homebrew completamente aggiornato/aggiornato), quindi ho reinstallato tutti i pacchetti richiesti sopra. Ecco l'output di 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 

Essendo un esperto di statistica e corto di idee, ho deciso di guardare la distribuzione del tasso di fallimento, vedere se questo potrebbe aiutare a far luce. Se l'esecuzione do_it() crash sopra su l'ennesima volta, e ho scritto dove n cade per 50 incidenti (ad esempio, la terza prova, poi il 7 ° prova), ottengo questa sequenza:

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 

che mi dà questa distribuzione:

non so se questo è rilevante o aiuta a tutti, anche se l'altra cosa che ho notato è in aumento il numero di righe nel dataframe d 5.000-10.000 sembra aumentare la media di n da Da ~ 8 a ~ 20.

Qualsiasi aiuto su questo sarebbe estremamente gradito!

+1

Molto probabilmente correlato a questo: https://github.com/hadley/dplyr/issues/1231 –

+0

Confermato su Windows, ultima versione a 64 bit, versione rstudio non più recente. dplyr_0.4.2 lubridate_1.3.3 Si blocca * ogni volta * Stranamente non scrive file di registro rstudio –

risposta

6

90% sicuro che questo è un bug nella versione più recente di dplyr (0.4.2), vedere questo problema qui: https://github.com/hadley/dplyr/issues/1231

declassamento mia versione di dplyr a 0.4.1 come correzioni segue la questione:

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

Non si blocca per me, n = 1000, 'RStudio 0.98.1062. dplyr_0.4.0, lubridate_1.3.3' 0.4.2 suona come il problema. – Vlo

+0

Non va in crash per me, n = 1000, dplyr_0.4.1 – jeremycg