2013-03-31 17 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