使用 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 的情况下崩溃,但这在我的机器上不会可靠地发生。

我尝试过的事情包括:

我是 运行 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 获得。