使用 tidyr::unnest_wider 时 R 崩溃
R crashes when using tidyr::unnest_wider
运行 tidyr::unnest_wider
作为管道的一部分,例如
df <- df %>%
unnest_wider(col, names_sep = "_", names_repair = "universal")
R 崩溃并报告以下错误,
[91205:91206:20220410,071753.955164:ERROR file_io_posix.cc:148] open /home/matt/.r/crashpad_database/pending/dc2183c4-0851-4c62-908e-7d4e41a2702e.lock: File exists (17)
[91205:91205:20220410,071753.957703:ERROR process_memory_range.cc:86] read out of range
[91205:91205:20220410,071753.957712:ERROR elf_image_reader.cc:558] missing nul-terminator
[91205:91205:20220410,071753.957794:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960132:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960189:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960236:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960281:ERROR elf_dynamic_array_reader.h:61] tag not found
我正在使用的数据框非常复杂,有很多列,其中有几列是嵌套的。这是我要取消嵌套的列的结构(仅显示前 3 个元素,因为其他 1453 个元素相似):
> str(spatial_firing$shuffle_results_b_o)
List of 1456
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.004358 0.036137 0.015214 0.001598 0.000695 ...
..$ slope : num [1:1000] 0.01191 0.02476 0.02087 -0.00629 -0.00461 ...
..$ p.value : num [1:1000] 0.616 0.146 0.348 0.762 0.842 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.00722 0.01216 0.00534 0.01284 0.04958 ...
..$ slope : num [1:1000] 0.0203 -0.0223 -0.0157 0.0209 -0.0448 ...
..$ p.value : num [1:1000] 0.5186 0.4015 0.5791 0.3886 0.0873 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.000795 0.001298 0.00132 0.000165 0.033603 ...
..$ slope : num [1:1000] -0.00453 0.00685 0.00645 -0.0024 0.04619 ...
..$ p.value : num [1:1000] 0.831 0.785 0.783 0.922 0.161 ...
这是一个可重现的例子:
library(tidyverse)
f <- function(n) {
df <- tibble(neuron=0:(n-1), r.squared = rnorm(n),
slope = rnorm(n), p.value = rnorm(n))
df$p.value[2] <- NA
df
}
df <- replicate(1000, f(1000), simplify = FALSE)
dff <- tibble(x=df)
for (i in 1:100) {
cat(i, "\n")
unnest_wider(dff, x)
}
在我的机器上,引入 NA 会导致此问题通常在第 3 步或第 4 步崩溃。在下面的答案中,代码会在没有 NA 的情况下崩溃,但这在我的机器上不会可靠地发生。
我尝试过的事情包括:
- 尽可能简化我正在使用的数据框。这没有帮助。
- 正在检查内存使用情况。这似乎不是问题。有足够的空闲 RAM,当我填满 RAM 和大部分交换 space.
时,我的简单示例代码运行良好
- 运行同机代码在一个Rocker镜像中。这复制了崩溃。
- 运行 emacs/ESS 中的代码而不是 R Studio。代码在同一点失败。
我是 运行 Ubuntu 20.04.4 上的 R 版本 4.1.3。
我欢迎提出解决方案或其他故障排除测试的建议。
这不是一个答案,而是一个可重现的例子。似乎是 tidyr
中的一个错误或底层 tidyverse 机器中的某个地方(根据定义,分段错误是一个错误 - R end-user 所做的任何事情都不会与编译(C++/Fortran/etc.) 代码应该能够使 R 会话崩溃,除非可能是由于内存耗尽)。
如果我是你,我会post一个tidyr issue about this……(tidyr
的最新开发版本也会发生这种情况)。
library(tidyverse)
f <- function(n) tibble(neuron=0:(n-1), r.squared = rnorm(n),
slope = rnorm(n), p.value = rnorm(n))
df <- replicate(1000, f(1000), simplify = FALSE)
结果与您的相似:
str(df[1:3])
List of 3
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.421 -0.445 0.816 0.752 0.635 ...
..$ slope : num [1:1000] 0.059 -1.4899 -0.0384 0.2601 -0.6293 ...
..$ p.value : num [1:1000] -0.754 1.023 0.123 0.817 0.382 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.504 0.153 -1.397 0.938 0.948 ...
..$ slope : num [1:1000] 0.9693 -1.2223 -0.4863 1.0936 -0.0792 ...
..$ p.value : num [1:1000] -1.018 -2.313 -1.593 -0.528 0.783 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.73 -0.926 2.144 0.795 1.002 ...
..$ slope : num [1:1000] -1.622 -0.664 1.286 0.419 1.285 ...
..$ p.value : num [1:1000] 1.408 -1.458 -1.096 0.339 -0.295 ...
unnest_wider
应该应用于 list-column,而您向我们展示了一个列表,所以我会从中创建一个 list-column。
这在我的机器上的第 3 次迭代时崩溃(“内存未映射”的分段错误)。
dff <- tibble(x=df)
for (i in 1:100) {
cat(i, "\n")
unnest_wider(dff, x)
}
R不稳定,PopOS! 21.04,tidyr 版本 1.2.0
问题已通过更新 r-lib/vctrs 解决:
devtools::install_github("r-lib/vctrs#1553")
我已经确认这适用于可重现的示例和原始问题。
更新:
固定的 r-lib/vctrs 现在可以从 CRAN 获得。
运行 tidyr::unnest_wider
作为管道的一部分,例如
df <- df %>%
unnest_wider(col, names_sep = "_", names_repair = "universal")
R 崩溃并报告以下错误,
[91205:91206:20220410,071753.955164:ERROR file_io_posix.cc:148] open /home/matt/.r/crashpad_database/pending/dc2183c4-0851-4c62-908e-7d4e41a2702e.lock: File exists (17)
[91205:91205:20220410,071753.957703:ERROR process_memory_range.cc:86] read out of range
[91205:91205:20220410,071753.957712:ERROR elf_image_reader.cc:558] missing nul-terminator
[91205:91205:20220410,071753.957794:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960132:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960189:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960236:ERROR elf_dynamic_array_reader.h:61] tag not found
[91205:91205:20220410,071753.960281:ERROR elf_dynamic_array_reader.h:61] tag not found
我正在使用的数据框非常复杂,有很多列,其中有几列是嵌套的。这是我要取消嵌套的列的结构(仅显示前 3 个元素,因为其他 1453 个元素相似):
> str(spatial_firing$shuffle_results_b_o)
List of 1456
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.004358 0.036137 0.015214 0.001598 0.000695 ...
..$ slope : num [1:1000] 0.01191 0.02476 0.02087 -0.00629 -0.00461 ...
..$ p.value : num [1:1000] 0.616 0.146 0.348 0.762 0.842 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.00722 0.01216 0.00534 0.01284 0.04958 ...
..$ slope : num [1:1000] 0.0203 -0.0223 -0.0157 0.0209 -0.0448 ...
..$ p.value : num [1:1000] 0.5186 0.4015 0.5791 0.3886 0.0873 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.000795 0.001298 0.00132 0.000165 0.033603 ...
..$ slope : num [1:1000] -0.00453 0.00685 0.00645 -0.0024 0.04619 ...
..$ p.value : num [1:1000] 0.831 0.785 0.783 0.922 0.161 ...
这是一个可重现的例子:
library(tidyverse)
f <- function(n) {
df <- tibble(neuron=0:(n-1), r.squared = rnorm(n),
slope = rnorm(n), p.value = rnorm(n))
df$p.value[2] <- NA
df
}
df <- replicate(1000, f(1000), simplify = FALSE)
dff <- tibble(x=df)
for (i in 1:100) {
cat(i, "\n")
unnest_wider(dff, x)
}
在我的机器上,引入 NA 会导致此问题通常在第 3 步或第 4 步崩溃。在下面的答案中,代码会在没有 NA 的情况下崩溃,但这在我的机器上不会可靠地发生。
我尝试过的事情包括:
- 尽可能简化我正在使用的数据框。这没有帮助。
- 正在检查内存使用情况。这似乎不是问题。有足够的空闲 RAM,当我填满 RAM 和大部分交换 space. 时,我的简单示例代码运行良好
- 运行同机代码在一个Rocker镜像中。这复制了崩溃。
- 运行 emacs/ESS 中的代码而不是 R Studio。代码在同一点失败。
我是 运行 Ubuntu 20.04.4 上的 R 版本 4.1.3。
我欢迎提出解决方案或其他故障排除测试的建议。
这不是一个答案,而是一个可重现的例子。似乎是 tidyr
中的一个错误或底层 tidyverse 机器中的某个地方(根据定义,分段错误是一个错误 - R end-user 所做的任何事情都不会与编译(C++/Fortran/etc.) 代码应该能够使 R 会话崩溃,除非可能是由于内存耗尽)。
如果我是你,我会post一个tidyr issue about this……(tidyr
的最新开发版本也会发生这种情况)。
library(tidyverse)
f <- function(n) tibble(neuron=0:(n-1), r.squared = rnorm(n),
slope = rnorm(n), p.value = rnorm(n))
df <- replicate(1000, f(1000), simplify = FALSE)
结果与您的相似:
str(df[1:3])
List of 3
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.421 -0.445 0.816 0.752 0.635 ...
..$ slope : num [1:1000] 0.059 -1.4899 -0.0384 0.2601 -0.6293 ...
..$ p.value : num [1:1000] -0.754 1.023 0.123 0.817 0.382 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.504 0.153 -1.397 0.938 0.948 ...
..$ slope : num [1:1000] 0.9693 -1.2223 -0.4863 1.0936 -0.0792 ...
..$ p.value : num [1:1000] -1.018 -2.313 -1.593 -0.528 0.783 ...
$ : tibble [1,000 × 4] (S3: tbl_df/tbl/data.frame)
..$ neuron : int [1:1000] 0 1 2 3 4 5 6 7 8 9 ...
..$ r.squared: num [1:1000] 0.73 -0.926 2.144 0.795 1.002 ...
..$ slope : num [1:1000] -1.622 -0.664 1.286 0.419 1.285 ...
..$ p.value : num [1:1000] 1.408 -1.458 -1.096 0.339 -0.295 ...
unnest_wider
应该应用于 list-column,而您向我们展示了一个列表,所以我会从中创建一个 list-column。
这在我的机器上的第 3 次迭代时崩溃(“内存未映射”的分段错误)。
dff <- tibble(x=df)
for (i in 1:100) {
cat(i, "\n")
unnest_wider(dff, x)
}
R不稳定,PopOS! 21.04,tidyr 版本 1.2.0
问题已通过更新 r-lib/vctrs 解决:
devtools::install_github("r-lib/vctrs#1553")
我已经确认这适用于可重现的示例和原始问题。
更新: 固定的 r-lib/vctrs 现在可以从 CRAN 获得。