0

我将如何创建一个名为的函数,该函数rm2接收未知数量的对象,删除它们,然后运行gc()

我已经尝试了可能的事情,但无法弄清楚。

rm2 <- function(...){
  #files <- list(...)
  #files <- list(deparse(substitute(...)))
  #rm(list = files)
  rm(...)
  capture.output(gc(),file='NUL')
}

我会很感激。

另外,让我们尽量不要提出gc()投诉。我发现它确实有助于为我的主机操作系统释放 RAM :)

4

3 回答 3

2

一个简单的选择是像rm它自己一样做,并使用...来自匹配的调用(from match.call)。这给出了一个符号列表,然后我使用 . 将其转换为字符向量sapplyrm然后将此向量作为参数传递给list。最后我们只返回输出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"
于 2013-03-31T17:39:27.590 回答
0

不确定,但也许是这样:

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())
}

PS use NULLnot'NUL'尽管默认是使用NULL任何方式,因此没有必要包含它。

于 2013-03-31T17:18:51.850 回答
-1

怎么样:

rm2 <- function(...) {
    Call <- match.call(expand.dots = TRUE)
    Call[[1L]] <- as.name("rm")
    eval.parent(Call)
    gc(verbose = FALSE, reset = TRUE)
    NULL
}

第一部分基于write.csv功能。然后你gc使用详细设置FALSE来防止打印信息。最后函数返回NULL(没有它,它会打印gc出内存清理摘要的结果)。

于 2013-03-31T21:31:58.713 回答