通过常规方式(例如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)]
这是对您可以使用一个环境的应用程序一个存储容器而不是一个列表?如果你做'e < - as.environment(TEST)','rm(“A”,envir = e)'应该比'TEST [“A”] < - NULL'快得多。 (未经测试)。 –
关于复制/修改[**此页**](http://stackoverflow.com/a/16370240/1478381)有一个很好的问题,我链接到这个特定的答案,因为它是非常说明性的,可能值得更多的爱! –
我认为你需要'reflist'作为建议[这里](https://r-forge.r-project.org/tracker/?func=detail&atid=978&aid=2351&group_id=240)。一种可以在列表中工作的方法(类似于'data.table:=/set')。至今尚未实施。 – mnel