2011-08-24 11 views
6

オブジェクトが存在する場合は削除する関数を記述しようとしています。理由は、私がログメッセージを取り除きたいということです。エラー:オブジェクト 'arg'が見つかりません。私が試した次:それは私が間違ってここに何をすべきか存在するオブジェクトを削除する関数を作成します。

> ifrm <- function(arg) 
+ { 
+ if(exists(as.character(substitute(arg)))){rm(arg)} 
+ } 
> a <- 2 
> ifrm(a) 
> a 
[1] 2 

任意のヒントが存在する場合

ifrm <- function(arg) 
{ 
    if(exists(as.character(substitute(arg)))){rm(arg)} 
} 

は、残念ながら、これはオブジェクトを削除しないのですか?

ベストブレヒト

+2

を試してみてください。このエラーが発生した状況についてもう少し詳細を教えてください。より適切なエラーメッセージを処理する他の方法があるかもしれません。 – Andrie

+1

私はAndrieに同意します。提供された回答はあなたが聞いたことをするでしょうが、あなたが実際にやっているべきことは、もっと簡単です。 tryとtrycatchを見てみましょう。存在しないオブジェクトを処理しようとしているのですか? –

答えて

8

ユーザーが関数の引数として指定したものを取得する一般的なイディオムは、deparse(substitute(foo))です。この関数は、@Ianロスのそれに似ていますが、この標準のイディオムを採用している:私はあなたしかしたがって、地球環境、デフォルトからオブジェクトを削除するとしていますが、envを経由して環境を供給することができ

ifrm <- function(obj, env = globalenv()) { 
    obj <- deparse(substitute(obj)) 
    if(exists(obj, envir = env)) { 
     rm(list = obj, envir = env) 
    } 
} 

。そしてここにそれは行動している:

> a <- 1:10 
> ls() 
[1] "a" "ifrm" 
> ifrm(a) 
> ls() 
[1] "ifrm" 
> ifrm(a) 
> ls() 
[1] "ifrm" 
+2

ネストした関数でdeparse(substitute())を使用すると問題が発生することを警告するメッセージを追加する必要があります。 myrm < - function(x)ifrm(x)は、あなたが思っていることをしません。 –

+1

@Joris +1良い点ですが、それをしないでください! ;-) –

1

これは一種の醜いですが、動作するようです:

ifrm <- function(arg) { 
    if (exists(as.character(substitute(arg)))) { 
    rm(list=as.character(substitute(arg)), envir=sys.frame()) 
    } 
} 

あなたはトップレベルの環境から名前を削除していない場合は、異なった環境を指定することもできます。

3

それを簡単に保つ。実際のオブジェクトから名前を取得しようとするのではなく、オブジェクトの名前を関数に文字列として渡すだけです。

ifrm <- function(x, env = globalenv()) 
{ 
    if(exists(x, envir = env)) 
    { 
    rm(list = x, envir = env) 
    } 
} 
2

これが行うには、おそらく危険なことのように聞こえるこの

a=1; b=3; y=4; ls() 
rm(list = Filter(exists, c("a", "b", "x", "y"))) 
ls() 
関連する問題