2016-09-30 50 views
0

安排的功能,下面的代码一致产生我R系统3.2.2上崩溃:为什么这个“段错误”与dplyr 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 

这是为什么崩溃发生,我该如何纠正呢?

+0

你是怎么安装dplyr的? – zwol

+0

如果您检查'str(dd)',列仍然是'list'。 'lll'是一个嵌套列表。你可能需要'dd < - data.frame(do.call(rbind,lapply(lll,unlist)))' – akrun

+0

将'lll'转换为数据框的最佳方法是什么? – rnso

回答

2

这是一个嵌套list,所以一个办法是unlistlistrbindlist并转换为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 

或者使用purrr/dplyr

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

这必须是dplyr中的错误,R核心中的错误或不兼容dplyr的编译组件与R核心之间的差异。在R语言中不应该有任何任何东西,导致解释器崩溃。

对dplyr本身并不特别熟悉,我猜想不兼容是最可能的解释,dplyr中的错误是第二可能的。例如,如果您安装了dplyr install.packages,然后升级了R核并且没有重新安装dplyr,则可能会出现不兼容问题。 R核心具有防御机制,可以防止不兼容的编译代码模块被更新的解释器拾取,但它们并不总是有效。

如果您仍然能够重现R和dplyr,最新版本的问题已经消灭了$HOME/R如果存在的话后,然后重新安装dplyr,我会建议在https://github.com/hadley/dplyr/issues提交的bug报告。

+0

我有用“install.packages”安装dplyr。我也更新了R,但在dplyr之前或之后不确定。我正在尝试更新两者。 – rnso

0

我发现下面的代码也能正常工作:这里不需要

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

的do.call和rbind功能。