2016-09-30 3 views
0

Code Nach arrangiert konsequent produziert Absturz auf meinem R System 3.2.2:Warum diese „segfault“ mit dplyr Funktion in R

> R.version 
       _       
platform  i486-slackware-linux-gnu  
arch   i486       
os    linux-gnu     
system   i486, linux-gnu    
status          
major   3       
minor   2.2       
year   2015       
month   08       
day   14       
svn rev  69053      
language  R       
version.string R version 3.2.2 (2015-08-14) 
nickname  Fire Safety    

> lll = list(list(5,3,4), list(5,3,7), list(6,2,1), list(6,1,3), list(5,2,1)) 
> dd = data.frame(do.call(rbind, lll)) 
> dd 
    X1 X2 X3 
1 5 3 4 
2 5 3 7 
3 6 2 1 
4 6 1 3 
5 5 2 1 

> dplyr::arrange(dd, X1) 

*** caught segfault *** 
address (nil), cause 'memory not mapped' 

Traceback: 
1: .Call("dplyr_arrange_impl", PACKAGE = "dplyr", data, dots) 
2: arrange_impl(.data, dots) 
3: arrange_.tbl_df(tbl_df(.data), .dots = dots) 
4: arrange_(tbl_df(.data), .dots = dots) 
5: as.data.frame(arrange_(tbl_df(.data), .dots = dots)) 
6: arrange_.data.frame(.data, .dots = lazyeval::lazy_dots(...)) 
7: arrange_(.data, .dots = lazyeval::lazy_dots(...)) 
8: dplyr::arrange(dd, X1) 

Possible actions: 
1: abort (with core dump, if enabled) 
2: normal R exit 
3: exit R without saving workspace 
4: exit R saving workspace 

Warum dieser Absturz auftritt und wie kann ich es beheben?

+0

Wie haben Sie dplyr installiert? – zwol

+0

Die Spalten sind noch "liste", wenn Sie die 'str (dd)' überprüfen. Die 'lll' ist eine verschachtelte Liste. Sie können brauchen 'dd <- data.frame (do.call (rbind, lapply (lll, unlist)))' – akrun

+0

Was ist der beste Weg, 'lll' in einen Datenrahmen zu konvertieren? – rnso

Antwort

2

Es ist eine verschachtelte list, so eine Art und Weise zu unlist die innere list, wäre rbind die äußere list und konvertieren data.frame

dd <- data.frame(do.call(rbind, lapply(lll, unlist))) 
arrange(dd, X1) 
# X1 X2 X3 
#1 5 3 4 
#2 5 3 7 
#3 5 2 1 
#4 6 2 1 
#5 6 1 3 

Oder verwenden purrr/dplyr

library(purrr) 
lll%>% 
    transpose %>% 
    map(lift(c)) %>% 
    setNames(., paste0("X", seq_along(.))) %>% 
    data.frame() %>% 
    arrange(X1) 
2

Diese muss entweder ein Fehler in dplyr sein, ein Fehler in R Core oder ein Inkompatibilitätsfehler zwischen der kompilierten Komponente von dplyr und dem R-Kern. Es ist nicht möglich, irgendetwas aus der R-Sprache zu tun, die den Interpreter zum Absturz bringt.

Da ich mit dplyr selbst nicht besonders vertraut bin, würde ich annehmen, dass eine Inkompatibilität die wahrscheinlichste Erklärung ist und ein Fehler in dplyr am zweithäufigsten ist. Eine Inkompatibilität könnte zum Beispiel auftreten, wenn Sie dplyr mit install.packages installiert und dann R Core aktualisiert und dplyr nicht neu installiert. R-Core hat defensive Mechanismen, die verhindern sollen, dass inkompatible kompilierte Code-Module von einem neueren Interpreter aufgenommen werden, aber sie funktionieren nicht immer.

Wenn Sie das Problem mit den neuesten Versionen von R und dplyr reproduzieren können, nachdem Sie $HOME/R ausgelöscht haben, wenn es existiert und dann dplyr erneut installierte, würde ich empfehlen, einen Fehlerbericht unter https://github.com/hadley/dplyr/issues einzureichen.

+0

Ich hatte installiert dplyr mit "install.packages". Ich habe auch R aktualisiert, bin aber vor oder nach dplyr nicht sicher. Ich versuche, beide jetzt zu aktualisieren. – rnso

0

Ich fand auch folgende Code richtig funktioniert:

> dd = data.frame(t(sapply(lll, unlist))) 
> dd 
    X1 X2 X3 
1 5 3 4 
2 5 3 7 
3 6 2 1 
4 6 1 3 
5 5 2 1 
> str(dd) 
'data.frame': 5 obs. of 3 variables: 
$ X1: num 5 5 6 6 5 
$ X2: num 3 3 2 1 2 
$ X3: num 4 7 1 3 1 
> 
> arrange(dd, X1) 
    X1 X2 X3 
1 5 3 4 
2 5 3 7 
3 5 2 1 
4 6 2 1 
5 6 1 3 
> 

Die do.call und rbind Funktionen sind hier nicht erforderlich.