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が試行されている不正な環境が原因です。
これにはどんな修正がありますか?良好な定着用
基準:
- 発呼者が被呼者(rel.mem)はR言語の機能を使用して環境を決定することができるはず
- 環境を通過する必要はありません(コールスタックの検査、アスペクトなど)
- 関数rel.memのインタフェースは単純に保つ必要があります。つまり、rel.memを呼び出してからrel.memを呼び出すと、渡す必要はありません環境。
NOTES:
- として多くのコメンターは1つの簡単な修正が環境を通過させることであることを指摘しています。
- 私は良い修正が意味することは、呼び出し元が参照していたときに呼び出し元関数(この場合はrel.mem)が環境を計算/検出できることです適切な環境からのオブジェクト
- "2"の推論のタイプは、呼び出しスタックを検査することによって他の言語で行うことができます。たとえば、Javaではダミーの例外をスローし、キャッチしてコールスタックを解析します。他の言語でも、私はAspect Orientedテクニックを使うことができました。問題は、Rで行われるようなことですか?
- コメント者が同じ名前のオブジェクトが複数存在する可能性があることを示唆しているため、「正しい」環境は無意味です。上記のように、他の言語では(時には創造的なトリッキーがあります)呼び出しスタックを解釈する - これは可能ではない可能性があります。R
- rm(list = nm、envir = parent.frame())は、これを親環境から削除することを示唆しています。これは正しいですが、私は任意のコール深度で動作するものを探しています。
また、あなたの質問を理解する上で重要でない限り、 'rm(list = ls())'のようなコマンドを投稿しないでください - 誤って実行している人はいないようにしてください。 – Gregor
@ Gregor - 実際に私が指定しているはずだった - 私の質問は - 毎回明示的に環境を渡すことなくそれを行う方法はありますか? – user1172468
@Gregor - 更新された質問...ありがとうございます。 – user1172468