2016-12-19 10 views
0

次の例では、添付後にxでも変更されていますが、値aは変更されません。 attach()オブジェクトのコピーを作成しますかxattach()によって保存されたxを突然変異させる方法はありますか?添付オブジェクトの変更が効果をもたらさないのはなぜですか?

R> x=list(a=1,b=2) 
R> attach(x) 
R> search() 
[1] ".GlobalEnv"  "x"     "package:stats"  
[4] "package:graphics" "package:grDevices" "package:utils"  
[7] "package:datasets" "package:methods" "Autoloads"   
[10] "package:base"  
R> x$a=2 
R> search() 
[1] ".GlobalEnv"  "x"     "package:stats"  
[4] "package:graphics" "package:grDevices" "package:utils"  
[7] "package:datasets" "package:methods" "Autoloads"   
[10] "package:base"  
R> a 
[1] 1 
R> 
+4

「?attach'、*」データベースは実際には添付されず、検索パスとリストの要素(データフレームの列を含む)または保存ファイル内のオブジェクトに新しい環境が作成されます。 << - を使用してアタッチされたデータベースにアサインすると、オリジナルのオブジェクトではなく、アタッチされたコピーのみを変更します(通常の割り当てでは、ユーザのワークスペースに変更されたバージョンが配置されます。このため、添付は混乱につながる可能性があります。 – nrussell

+0

@nurlsell、回答として投稿しますか? –

+0

私はその質問がおそらくちょうど削除されるかもしれないと思う。すべての情報はドキュメントに記載されています。あなたが同意しない場合は、お気軽に回答を書き留めてください。 – nrussell

答えて

2

我々はattach(x)xと呼ばれる検索リストに新しいエントリを作成しますが、変数xはまだワークスペースにある元のリストを参照します。したがって、x$aに割り当てると、検索リストの新しいエントリではなく、ワークスペース内の元のxに割り当てられます。元のリストxを削除しても、x$aという構文は、検索リストの新しいエントリのaを参照するために使用することはできません。しかし、代替案があります。最初に新しいRセッションを開始して、残った迷惑メールがないことを確認します。これは、通常のアドバイスはちょうど最初の場所でattachを使用していないことを十分に混乱し、気になる

# define a list and attach it 
x <- list(a = 1, b = 2) 
attach(x) 

# a few different ways of assigning to a in x on the search list 


# 1 
assign("a", 99, "x") 
a 
## [1] 99 

# 2 
env_x <- as.environment("x") 
env_x$a <- 100 
a 
## [1] 100 

# 3 
a <<- 200 
a 
## [1] 200 
env_x$a 
## [1] 200 

# the a in the original list x is unchanged 
x$a 
## [1] 1 

:そして、これを試してみてください。

+0

残念ながら、 'attach()'は 'attachNamespace()'で使われます。これは 'library()'によって呼び出されます。 'attach()'を使うべきでないならば、 'library()'は外部パッケージを公開するためのより良い方法に頼るべきですか? – user1424739

+1

これは、ユーザーが直接使用していることを指していました。 –

+0

'<< - 'の使い方についてコメントできますか? 'env_v $ a'が' a'だけでどのように見つかるかはわかりません。 – user1424739

関連する問題