rm和垃圾收集包装器
如何创建一个名为rm和垃圾收集包装器,r,garbage-collection,wrapper,R,Garbage Collection,Wrapper,如何创建一个名为rm2的函数,该函数接收未知数量的对象,删除它们,然后运行gc() 我试过很多事情,但都想不出来 rm2 <- function(...){ #files <- list(...) #files <- list(deparse(substitute(...))) #rm(list = files) rm(...) capture.output(gc(),file='NUL') } rm2不确定,但可能是: rm2 <- functio
rm2
的函数,该函数接收未知数量的对象,删除它们,然后运行gc()
我试过很多事情,但都想不出来
rm2 <- function(...){
#files <- list(...)
#files <- list(deparse(substitute(...)))
#rm(list = files)
rm(...)
capture.output(gc(),file='NUL')
}
rm2不确定,但可能是:
rm2 <- function(...) {
x <- substitute(...())
Trim <- function (x) gsub("\\s+$", "", x)
z <- Trim(unlist(lapply(x, function(y) as.character(y))))
rm(list=z, envir = .GlobalEnv)
capture.output(gc())
}
rm2一个简单的选项是按照rm
本身的操作,使用匹配调用中的..
(来自match.call
)。这给出了一个符号列表,然后我使用sapply
将其转换为字符向量。然后,该向量作为参数列表传递给rm
。最后,我们只返回gc
的输出:
rm2 <- function(...) {
dots <- match.call(expand.dots = FALSE)$...
dots <- sapply(dots, as.character)
rm(list = dots, envir = globalenv())
gc()
}
> ls()
[1] "pred" "reg4" "rm2" "tenv" "x" "y"
> rm2(x, y)
used (Mb) gc trigger (Mb) max used (Mb)
Ncells 226670 12.2 467875 25 350000 18.7
Vcells 357248 2.8 905753 7 867363 6.7
> ls()
[1] "pred" "reg4" "rm2" "tenv"
rm2 ls()
[1] “pred”“reg4”“rm2”“tenv”
那么:
rm2 <- function(...) {
Call <- match.call(expand.dots = TRUE)
Call[[1L]] <- as.name("rm")
eval.parent(Call)
gc(verbose = FALSE, reset = TRUE)
NULL
}
rm2您是否尝试过在rm2
函数中使用envir
参数rm
?我认为捕获没有多大用处。输出
-只要返回gc()
就可以了。我不知道OP harbor为什么刚刚把它放在里面。啊-错过了。但老实说,我认为他们只是想把输出导向一个他们不需要看到的地方。在invisible()
中包装gc
可能是最好的解决方案。谢谢Gavin!这是greatMarek,我也喜欢这种方法。非常感谢。另外,谢谢你的空提示!我认为这是一种非常糟糕的编程技术,希望write.csv
没有使用它。(同样,返回rm的输出会更好)