r - 就地删除列表元素

标签 r list memory in-place

通过常规方式(例如 ll["name"] <- NULL )从列表中删除元素会导致整个列表被复制。通常,这不会引起注意,直到数据集变大。

我有一个包含十几个元素的列表,每个元素的大小在 0.25 到 2 GB 之间。从这个列表中删除三个元素需要大约十分钟的时间来执行(在相对较快的机器上。)

有没有办法就地从列表中删除元素?


我尝试了以下方法:

TEST <- list(A=1:20,  B=1:5)

TEST[["B"]] <- NULL
TEST["B"] <- NULL
TEST <- TEST[c(TRUE, FALSE)]
data.table::set(TEST, "B", value=NULL) # ERROR

带内存信息的输出:

cat("\n\n\nATTEMPT 1\n")
TEST <- list(A=1:20,  B=1:5)
.Internal(inspect(TEST))
TEST[["B"]] <- NULL
.Internal(inspect(TEST))

cat("\n\n\nATTEMPT 2\n")
TEST <- list(A=1:20,  B=1:5)
.Internal(inspect(TEST))
TEST["B"] <- NULL
.Internal(inspect(TEST))

cat("\n\n\nATTEMPT 3\n")
TEST <- list(A=1:20,  B=1:5)
.Internal(inspect(TEST))
TEST <- TEST[c(TRUE, FALSE)]

最佳答案

我不知道如何在不复制的情况下缩短向量。下一个最好的办法是将元素设置为缺失 NANULL .

根据 ?Extract , 您必须指定 TEST[i] <- list(NULL)将元素设置为 NULL .我的测试表明 i必须是整数或逻辑向量。

> TEST <- list(A=1:20,  B=1:5); .Internal(inspect(TEST))
@27d2c60 19 VECSXP g0c2 [NAM(1),ATT] (len=2, tl=0)
  @27dd9e0 13 INTSXP g0c6 [] (len=20, tl=0) 1,2,3,4,5,...
  @2805c98 13 INTSXP g0c3 [] (len=5, tl=0) 1,2,3,4,5
ATTRIB:
  @1f38be8 02 LISTSXP g0c0 [] 
    TAG: @d3f478 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "names" (has value)
    @2807430 16 STRSXP g0c2 [] (len=2, tl=0)
      @dc2628 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "A"
      @dc25f8 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "B"
> TEST[2] <- list(NULL); .Internal(inspect(TEST)); TEST
@27d2c60 19 VECSXP g0c2 [MARK,NAM(1),ATT] (len=2, tl=0)
  @27dd9e0 13 INTSXP g0c6 [MARK] (len=20, tl=0) 1,2,3,4,5,...
  @d3fb78 00 NILSXP g1c0 [MARK,NAM(2)] 
ATTRIB:
  @1f38be8 02 LISTSXP g0c0 [MARK] 
    TAG: @d3f478 01 SYMSXP g1c0 [MARK,LCK,gp=0x4000] "names" (has value)
    @2807430 16 STRSXP g0c2 [MARK] (len=2, tl=0)
      @dc2628 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "A"
      @dc25f8 09 CHARSXP g1c1 [MARK,gp=0x61] [ASCII] [cached] "B"
$A
 [1]  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20

$B
NULL

关于r - 就地删除列表元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19529080/

相关文章:

iphone - PDF 内存分配背后的 secret 是什么 (tf) (CGPDFDocumentRef)

r - grid.arrange ggplot2使用列而不是使用列表按行进行绘制

c# - 二进制搜索自定义数据类型列表以仅匹配一个字段

python - 将列表转换为集合和联合操作

Python 索引错误 : list index out of range

Java:内存中发生了什么?

android - 关于Android的内部存储和外部SD卡

r - 如何将代码从控制台复制到 Rstudio 中的编辑器/源代码 Pane

R 如何根据ID和最新状态日期合并2个数据框?

R:如何组合具有相同 id 的数据帧的行并采用最新的非 NA 值?