2011-04-26 16 views
20

私は関数にparams引数を与えて、それを添付して、リスト要素を参照するたびにparams $ aの代わりにaを使うことができます。attach()inside function

run.simulation<-function(model,params){ 
attach(params) 
# 
# Use elements of params as parameters in a simulation 
detach(params) 
} 

これに問題がありますか?私がcという名前のグローバル変数を定義していて、 "params"というリストのcという名前の要素を定義していて、その値がattachコマンドの後に使用されていたら?

答えて

25

ノアはすでにいくつかの例や本で見ても、添付ファイルを使用するのは悪い考えだと指摘しています。周りに道があります。 withと呼ばれる「ローカル接続」を使用することができます。ノアのダミーの例では、これは、同一の結果が得られますが、整然とあります

with(params, print(a)) 

ようになります。

+4

1フォートワース'行います。与えられた例では、 'with()'は 'params'から環境を作成し、' print(a) '_その環境を評価します。したがって、 'params'の要素は、式が評価されるときに' attach() 'する必要なしに可視になります。 –

+0

明快な答えをありがとうございました。 –

+0

最後に働いたのは 'myFun

8
このような範囲の問題を解決するための

最も簡単な方法は、単純な何かを試してみることは通常である:

a = 1 
params = c() 
params$a = 2 
myfun <- function(params) { 
    attach(params) 
    print(a) 
    detach(params) 
} 
myfun(params) 

次のオブジェクト(複数可)_by_ .GlobalEnvマスクされています。

a

# [1] 1 

ご覧のとおり、Rはピックアップされていますeグローバル属性aはここにあります。

それはattachを使用しないように、ほとんど常に良い考えだとdetach可能な限り - スコープは(ちなみに、それは変数c命名避けるためにも最善のハンドルするのが難しいされて終わる - Rを、多くの場合、あなたが参照しているかを把握しますしかし、そこには他にもたくさんの手紙があります、なぜそれを危険にさらすのですか?)。さらに、私は、解読することはほとんど不可能な着脱を使用してコードを見つける。

6

別の可能性がある:何 `と()`と `()内を説明

run.simulation <- function(model, params){ 
    # Assume params is a list of parameters from 
    # "params <- list(name1=value1, name2=value2, etc.)" 
    for (v in 1:length(params)) assign(names(params)[v], params[[v]]) 
    # Use elements of params as parameters in a simulation 
}