【问题标题】:Why this "segfault" with dplyr arrange function in R为什么这个“segfault”在 R 中带有 dplyr 排列功能
【发布时间】:2016-09-30 14:27:43
【问题描述】:

以下代码始终在我的 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

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

【问题讨论】:

  • 你是如何安装 dplyr 的?
  • 如果您检查str(dd),列仍然是listlll 是一个嵌套列表。你可能需要dd <- data.frame(do.call(rbind, lapply(lll, unlist)))
  • 将“lll”转换为数据框的最佳方法是什么?
  • 我在 R-devel (3.4.0) 上使用 dplyr 0.5.0 得到 Error: Unsupported vector type listpackageVersion("dplyr") 是什么?
  • 您可能会尝试更新到 0.5.0(尽管您的 R 版本也已过时...理想情况下您会同时更新...)

标签: r dplyr


【解决方案1】:

这必须是dplyr 中的错误、R 内核中的错误或dplyr 的编译组件与 R 内核之间的不兼容。不应该在 R 语言中做任何导致解释器崩溃的任何事情

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

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

【讨论】:

  • 我已经使用“install.packages”安装了 dplyr。我也更新了 R 但不确定在 dplyr 之前或之后。我现在正在尝试更新两者。
【解决方案2】:

它是一个嵌套的list,因此一种方法是将unlist 内部listrbind 外部list 转换为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)

【讨论】:

    【解决方案3】:

    我发现以下代码也可以正常工作:

    > 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 函数。

    【讨论】:

      猜你喜欢
      • 2021-07-24
      • 1970-01-01
      • 2014-09-15
      • 2023-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多