2010-03-21 50 views
4

我試圖從父環境中刪除的對象。使用RM從父環境中刪除對象()

rm_obj <- function(obj){ 
    a <-deparse(substitute(obj)) 
    print (a) 
    print(ls(envir=sys.frame(-1))) 
    rm(a,envir=sys.frame(-1)) 
} 
> x<-c(1,2,3) 
> rm_obj(x) 
[1] "x" 

[1] "rm_obj" "x"  
Warning message: 
In rm(a, envir = sys.frame(-1)) : object 'a' not found 

這將有助於澄清我對幀的誤解。

+3

你到底想幹什麼?當然'rm(x)'在這裏會更容易。 – 2010-03-21 02:47:50

+0

嗨德克, 這就是我開始。但是,函數外部的ls()表明該對象仍然存在。我想這意味着函數內的rm(x)只是在本地副本上運行?我再次可能是錯的。希望有人能解釋爲什麼會發生這種情況。我真的會試着去理解它。 拉斯 – user151410 2010-03-21 17:56:48

回答

10

你的框架是正確的,我認爲,這只是rm試圖移除a本身而不是評估a得到變量去除的引用名稱。請使用list參數代替:

rm(list=a,envir=sys.frame(-1)) 
+0

感謝喬納森, 這工作。這是消除大物體不適用後的正確方法嗎? 拉斯 – user151410 2010-03-21 17:54:16

+0

爲什麼不直接在這種情況下使用'rm'直接? – 2010-03-21 18:55:41

+0

哦!現在我明白德克的意思了。 我正在試驗明確釋放外部分配的內存(c/external-pointer)。我的實際功能類似於 free_ext_obj <-function(extptr){(free_ext_obj「,extptr) a <-deparse(substitute(extptr)) rm(list = a,envir = sys.frame(-1 )) } 這使我可以釋放外部資源並刪除「extptr」。我也嘗試使用終結器。但是,我想要一些明確的內容,以便可以在調用gc()之前釋放外部分配的內存。這是一個可重複使用的方法嗎?這更多是作爲內部功能。謝謝。 Russ – user151410 2010-03-21 22:49:30

0

以下代碼適用於我。

myEnv = new.env() 
assign('xx', 5, envir=myEnv) 
get('xx', envir=myEnv) 
rm('xx', envir=myEnv)