2013-03-31 42 views
0

我怎么会让一个名为rm2函数,它在一个未知的对象,删除它们,然后运行gc()RM和垃圾收集包装

我已经尝试了可能的事情,但不能弄明白。

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

我将不胜感激。

而且,让尽量不弹出gc()投诉。我发现它确实有助于RAM释放到我的主机OS :)

+0

您是否尝试过使用'rm'的'envir'参数在'rm2'功能? –

回答

2

一个简单的选择是按照rm本身的做法,并使用匹配调用中的...(来自match.call)。这给出了一个符号列表,然后我使用sapply将其转换为字符向量。这个矢量然后被传递给rm作为参数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" 
+0

谢谢加文!这很棒 – Brad

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使用NULL'NUL'虽然默认是使用NULL任何方式,所以它不是必须包括它。

+0

我不认为'capture.output'有太多用处 - 只要返回'gc()'应该没问题。 – Dason

+0

不知道为什么OP港刚刚把它留下。 –

+0

啊 - 错过了。但说实话,我认为他们只是试图将输出导向某个地方,他们不需要看到它。在'invisible()'中包装'gc'可能是IMO的最佳解决方案。 – Dason

-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结果是存储器清理的摘要)。

+0

Marek,我也喜欢这种方法。谢谢。还有,感谢NULL提示! – Brad

+0

我认为这是一个非常糟糕的编程技术,希望'write.csv'没有使用它。 (也返回rm的输出会更好) – hadley