在 R 中将 dplyr::mutate 与 lubridate::ymd_hms 组合随机导致段错误
Combining dplyr::mutate with lubridate::ymd_hms in R randomly causes segfault
我已尽我所能搜索与此相关的内容,但在 SO 或 dplyr 上没有找到任何内容 github;可能是一个新问题,因为下面的代码在今天之前运行良好?
问题在概念上很简单:有时但并非总是(即随机)调用 my_data %>% mutate(x = ymd_hms(x))
会导致 R 因捕获段错误而崩溃。我已将问题简化为最简单的形式(也在此处:https://gist.github.com/john-sandall/05c3abb24fc738ddc2ad):
require(lubridate)
require(dplyr)
set.seed(42)
make_some_random_datetimes = function(n) ymd("2015-01-01") + seconds(runif(n, min=0, max=60*60*24*365))
d = data.frame(
col1 = make_some_random_datetimes(5000),
col2 = make_some_random_datetimes(5000)
)
do_it = function() {
d %>% mutate(
col1 = ymd_hms(col1),
col2 = ymd_hms(col2) # for some reason, it only crashes when evaluating 2+ cols, if we removed this line it'd be fine
)
return(TRUE)
}
do_it() # doesn't crash every time...it fails every nth time where n is randomly distributed with mean of roughly 7.7
do_it_lots_of_times = function(n) for (i in 1:n) do_it()
do_it_lots_of_times(50) # almost guaranteed to fail on my machine
所以在某些时候,上面的运行 do_it()
会导致段错误,终端中的输出运行 R是
*** caught segfault ***
address 0x0, cause 'unknown'
我今天早上升级到 R 版本 3.2.1,虽然回滚到 3.2.0 并重新安装库没有帮助。然后我尝试了 uninstalling/re-installing R(使用 brew install r
和完全 updated/upgraded 自制软件),然后重新安装了上面所有需要的包。这是 sessionInfo() 的输出:
R version 3.2.1 (2015-06-18)
Platform: x86_64-apple-darwin14.3.0 (64-bit)
Running under: OS X 10.10.3 (Yosemite)
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.4.2 lubridate_1.3.3
loaded via a namespace (and not attached):
[1] lazyeval_0.1.10 R6_2.0.1 assertthat_0.1 magrittr_1.5 plyr_1.8.3 parallel_3.2.1
[7] DBI_0.3.1 tools_3.2.1 memoise_0.2.1 Rcpp_0.11.6 stringi_0.5-2 digest_0.6.8
[13] stringr_1.0.0
作为一名统计学家并且 运行 出于想法,我决定查看故障率的分布,看看这是否有助于阐明一些问题。如果上面的 运行 do_it()
第 n 次崩溃,我写下了 n 次崩溃的位置(例如第 3 次尝试,然后是第 7 次尝试),我得到这个序列:
3, 7, 9, 20, 9, 9, 9, 7, 4, 23, 6, 3, 3, 3, 7, 7, 3, 9, 6, 6, 7, 10, 13, 7, 3, 7, 4, 7, 9, 6, 7, 7, 6, 6, 7, 7, 7, 9, 6, 12, 7, 7, 5, 9, 18, 6, 7, 9, 9, 7
这给了我这个分布:
我不知道这是否相关或有帮助,尽管我注意到的另一件事是将数据帧中的行数 d
从 5000 增加到 10000 似乎增加了 n 的平均值~8 到 ~20。
非常欢迎任何帮助!
90% 确定这是最新版本的 dplyr (0.4.2) 中的错误,请在此处查看此问题:https://github.com/hadley/dplyr/issues/1231
按如下方式将我的 dplyr 版本降级到 0.4.1 解决了这个问题:
packageurl = "http://cran.r-project.org/src/contrib/Archive/dplyr/dplyr_0.4.1.tar.gz"
install.packages(packageurl, repos=NULL, type="source", dependencies = TRUE)
我已尽我所能搜索与此相关的内容,但在 SO 或 dplyr 上没有找到任何内容 github;可能是一个新问题,因为下面的代码在今天之前运行良好?
问题在概念上很简单:有时但并非总是(即随机)调用 my_data %>% mutate(x = ymd_hms(x))
会导致 R 因捕获段错误而崩溃。我已将问题简化为最简单的形式(也在此处:https://gist.github.com/john-sandall/05c3abb24fc738ddc2ad):
require(lubridate)
require(dplyr)
set.seed(42)
make_some_random_datetimes = function(n) ymd("2015-01-01") + seconds(runif(n, min=0, max=60*60*24*365))
d = data.frame(
col1 = make_some_random_datetimes(5000),
col2 = make_some_random_datetimes(5000)
)
do_it = function() {
d %>% mutate(
col1 = ymd_hms(col1),
col2 = ymd_hms(col2) # for some reason, it only crashes when evaluating 2+ cols, if we removed this line it'd be fine
)
return(TRUE)
}
do_it() # doesn't crash every time...it fails every nth time where n is randomly distributed with mean of roughly 7.7
do_it_lots_of_times = function(n) for (i in 1:n) do_it()
do_it_lots_of_times(50) # almost guaranteed to fail on my machine
所以在某些时候,上面的运行 do_it()
会导致段错误,终端中的输出运行 R是
*** caught segfault ***
address 0x0, cause 'unknown'
我今天早上升级到 R 版本 3.2.1,虽然回滚到 3.2.0 并重新安装库没有帮助。然后我尝试了 uninstalling/re-installing R(使用 brew install r
和完全 updated/upgraded 自制软件),然后重新安装了上面所有需要的包。这是 sessionInfo() 的输出:
R version 3.2.1 (2015-06-18)
Platform: x86_64-apple-darwin14.3.0 (64-bit)
Running under: OS X 10.10.3 (Yosemite)
locale:
[1] en_GB.UTF-8/en_GB.UTF-8/en_GB.UTF-8/C/en_GB.UTF-8/en_GB.UTF-8
attached base packages:
[1] stats graphics grDevices utils datasets methods base
other attached packages:
[1] dplyr_0.4.2 lubridate_1.3.3
loaded via a namespace (and not attached):
[1] lazyeval_0.1.10 R6_2.0.1 assertthat_0.1 magrittr_1.5 plyr_1.8.3 parallel_3.2.1
[7] DBI_0.3.1 tools_3.2.1 memoise_0.2.1 Rcpp_0.11.6 stringi_0.5-2 digest_0.6.8
[13] stringr_1.0.0
作为一名统计学家并且 运行 出于想法,我决定查看故障率的分布,看看这是否有助于阐明一些问题。如果上面的 运行 do_it()
第 n 次崩溃,我写下了 n 次崩溃的位置(例如第 3 次尝试,然后是第 7 次尝试),我得到这个序列:
3, 7, 9, 20, 9, 9, 9, 7, 4, 23, 6, 3, 3, 3, 7, 7, 3, 9, 6, 6, 7, 10, 13, 7, 3, 7, 4, 7, 9, 6, 7, 7, 6, 6, 7, 7, 7, 9, 6, 12, 7, 7, 5, 9, 18, 6, 7, 9, 9, 7
这给了我这个分布:
我不知道这是否相关或有帮助,尽管我注意到的另一件事是将数据帧中的行数 d
从 5000 增加到 10000 似乎增加了 n 的平均值~8 到 ~20。
非常欢迎任何帮助!
90% 确定这是最新版本的 dplyr (0.4.2) 中的错误,请在此处查看此问题:https://github.com/hadley/dplyr/issues/1231
按如下方式将我的 dplyr 版本降级到 0.4.1 解决了这个问题:
packageurl = "http://cran.r-project.org/src/contrib/Archive/dplyr/dplyr_0.4.1.tar.gz"
install.packages(packageurl, repos=NULL, type="source", dependencies = TRUE)