2017-10-27 8 views
0

"rm(list = ls()); gc()"と入力するのではなく、ワークスペースとメモリを同時に消去する関数を作成しようとしています。 。しかしrm(list = ls())は、関数内から呼び出されたときには機能しません。どうして?これを回避する方法はありますか?rm(list = ls())は関数内では機能しません。どうして?

> # Let's create an object 
> x = 0 
> ls() 
[1] "x" 
> 
> # This works fine: 
> rm(list = ls()); gc() 
     used (Mb) gc trigger (Mb) max used (Mb) 
Ncells 269975 14.5  592000 31.7 427012 22.9 
Vcells 474745 3.7 1023718 7.9 808322 6.2 
> ls() 
character(0) 
> 
> ## But if I try to create a function to do exactly the same thing, it doesn't work 
> # Creating the object again 
> x = 0 
> ls() 
[1] "x" 
> 
> #Here's the function (notice that I have to exclude the function name from the 
# list argument or the function would remove itself): 
> clear = function(list = ls()[-which(ls() == "clear")]){ 
+ rm(list = list); gc() 
+ } 
> ls() 
[1] "clear" "x"  
> 
+2

関数内Rは新しい環境を作成するため、グローバル環境では機能しません –

+1

a)関数を実行していません。 b)関数の中で、 'rm'は関数の範囲内でのみ評価されます。したがって、あなたの地球環境では何も削除されません。 '?rm'を見て、それに' envir = '引数があることに気づきましょう。 – thelatemail

答えて

3

rm実際にあなたが関数内でそれを使用している、それだけでその関数の環境に関連するすべてのオブジェクトを削除しかし以来、取り組んでいます。

は、両方の呼び出しにenvir = .GlobalEnvのパラメータを追加します。

rm(list = ls(envir = .GlobalEnv), envir = .GlobalEnv) 

はそれを行う必要があります。

は、私はまた、あなたがGCについてthis他の質問()私はそれはあなたが本当にがそれをを必要としない限り、明示的に呼び出すことをお勧めではないと信じて見てみましょうお勧めします。

+0

この場合、私は本当にそれが必要です。 –

+1

@LucasDeAbreuMaia 'gc'を手動で呼び出す必要があるなら、本当に難しいことをする必要があります。 – Roland

関連する問題