2016-09-02 4 views
0
rel.mem <- function(nm) { 
    rm(nm) 
} 

私は上記の機能rel.memを定義した - 私はこれを知っている - 今、あなたは私がrel.mem xは削除されません呼び出すかを見ることができ、単一の引数を取り、関数内のrmがR内のオブジェクトを削除しないのはなぜですか?

> ls() 
[1] "rel.mem" 
> x<-1:10 
> ls() 
[1] "rel.mem" "x"  
> rel.mem(x) 
> ls() 
[1] "rel.mem" "x"  

をRMにそれを渡します。 rmが試行されている不正な環境が原因です。

これにはどんな修正がありますか?良好な定着用

基準:

  1. 発呼者が被呼者(rel.mem)はR言語の機能を使用して環境を決定することができるはず
  2. 環境を通過する必要はありません(コールスタックの検査、アスペクトなど)
  3. 関数rel.memのインタフェースは単純に保つ必要があります。つまり、rel.memを呼び出してからrel.memを呼び出すと、渡す必要はありません環境。

NOTES:

  1. として多くのコメンターは1つの簡単な修正が環境を通過させることであることを指摘しています。
  2. 私は良い修正が意味することは、呼び出し元が参照していたときに呼び出し元関数(この場合はrel.mem)が環境を計算/検出できることです適切な環境からのオブジェクト
  3. "2"の推論のタイプは、呼び出しスタックを検査することによって他の言語で行うことができます。たとえば、Javaではダミーの例外をスローし、キャッチしてコールスタックを解析します。他の言語でも、私はAspect Orientedテクニックを使うことができました。問題は、Rで行われるようなことですか?
  4. コメント者が同じ名前のオブジェクトが複数存在する可能性があることを示唆しているため、「正しい」環境は無意味です。上記のように、他の言語では(時には創造的なトリッキーがあります)呼び出しスタックを解釈する - これは可能ではない可能性があります。R
  5. rm(list = nm、envir = parent.frame())は、これを親環境から削除することを示唆しています。これは正しいですが、私は任意のコール深度で動作するものを探しています。
+0

また、あなたの質問を理解する上で重要でない限り、 'rm(list = ls())'のようなコマンドを投稿しないでください - 誤って実行している人はいないようにしてください。 – Gregor

+0

@ Gregor - 実際に私が指定しているはずだった - 私の質問は - 毎回明示的に環境を渡すことなくそれを行う方法はありますか? – user1172468

+0

@Gregor - 更新された質問...ありがとうございます。 – user1172468

答えて

7

簡単な答えは、別の環境では、基本的にはボックス内の変数を描き、関数用のボックスと地球環境用のボックスがあるということです。あなたはそのボックスを見つける場所をrmに伝える必要があります。また

ので

rel_mem <- function(nm) { 
    # State the environment 
    rm(list=nm, envir = .GlobalEnv) 
} 
x = 10 
rel_mem("x") 

、あなたは、例えば、pos引数を使用することができます

rel_mem <- function(nm) { 
    rm(list=nm, pos=1) 
} 

あなたは環境のベクトルが表示されますsearch()を入力した場合、グローバルには数1です。

あなたが何か


を見つけるまで使用inherits = TRUEは、コールスタックを上がるために

  • 呼び出しスタックを1レベルアップに行きたい場合は、別の二つの選択肢が

    • envir = parent.frame()です上記のコードでは、私は文字としてオブジェクトを渡していることに気づきます - 私は"x"ではなく、xを渡しています。私たちは、賢いことと、私はちょうど関数から.GlobalEnvで物事を削除すると、一般的に悪い考えであることを追加します終了するにはsubstitute機能

      rel_mem <- function(nm) { 
          rm(list = as.character(substitute(nm)), envir = .GlobalEnv) 
      } 
      

      を使用してこの問題を回避することができます。

    +0

    答えに感謝しています。私は質問を更新しました。ありがとう。 – user1172468

    +0

    @BenBolkerあなたは正しいです - 私は任意の祖先ロケータのメカニズムを探しています – user1172468

    関連する問題