21

リスト要素 a を参照するたびに params$a の代わりに a を使用できるように、関数に params 引数を与えてからアタッチしたいと考えています。

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

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

4

4 に答える 4

25

ノアは、いくつかの例や本で見られるとしても、アタッチを使用することは悪い考えであるとすでに指摘しています。回避策があります。と呼ばれる「ローカルアタッチ」を使用できますwith。ノアのダミーの例では、これは次のようになります

with(params, print(a))

これは同じ結果になりますが、よりきれいになります。

于 2011-04-27T07:29:07.603 に答える
11

別の可能性は次のとおりです。

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
}
于 2012-07-16T13:41:27.807 に答える
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 はaここでグローバル属性を取得しています。

ほとんどの場合、可能な限りattachandを使用しないことをお勧めしdetachます -- スコープは最終的に扱いにくくなります (ちなみに、変数に名前を付けることも避けるのが最善ですc-- R はしばしばあなたが参照しているものを理解しますが、非常に多くの変数があります他の文字がそこにあるのに、なぜそれを危険にさらすのですか?)。さらに、アタッチ/デタッチを使用するコードを解読することはほとんど不可能です。

于 2011-04-27T01:08:30.260 に答える