2013-03-31 2 views
0

Как бы создать функцию с именем rm2, которая принимает неизвестное количество объектов, удаляет их, а затем запускает gc()?rm and Garbage Collection Wrapper

Я пробовал все, но не могу понять.

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

Я был бы признателен.

Кроме того, давайте попробуем не поднимать жалобы gc(). Я считаю, что это действительно помогает освободить оперативную память для моего хозяина OS :)

+0

Вы пытались использовать аргумент 'envir'' rm' в вашей функции '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

А - пропустил это. Но, честно говоря, я думаю, что они просто пытались направить вывод туда, где им не нужно было его видеть. Обертка 'gc' в' invisible() ', вероятно, является лучшим решением 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

Марек, мне тоже нравится этот подход. Спасибо. также, спасибо за подсказки NULL! – Brad

+0

Я думаю, что это действительно ужасная техника программирования и желание 'write.csv' не использовало ее. (Также возвращение вывода rm было бы еще лучше) – hadley