以下代码在我的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
为什么会发生这种崩溃,我该如何纠正?
答案 0 :(得分:2)
这是一个嵌套的list
,因此一种方法是unlist
内list
,rbind
外list
并转换为{{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函数。