为什么这个带有d​​plyr的“段错误”在R中排列

时间:2016-09-30 14:27:44

标签: r dplyr

以下代码在我的R系统3.2.2上始终产生崩溃:

> 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

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

3 个答案:

答案 0 :(得分:2)

这是一个嵌套的list,因此一种方法是unlistlistrbindlist并转换为{{1} }}

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

答案 1 :(得分:2)

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

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

如果仍然可以使用最新版本的R和dplyr重现问题,在清除$HOME/R后如果它存在然后重新安装dplyr,我建议在https://github.com/hadley/dplyr/issues提交错误报告。

答案 2 :(得分: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函数。