2012-05-23 17 views
14

どのように割り当てがR言語で動作するのだろうか。R言語での割り当て

> x <- c(5, 6, 7) 
> x[1] <- 10 
> x 
[1] 10 6 7 
> 

私は完全に理解して:

には、以下のRシェルセッションを考えてみましょう。ベクトル(5,6,7)が作成され、記号「x」の にバインドされます。その後、ベクトル は不変のデータ構造であるため、 'x'は新しいベクトル(10,6,7)にリバウンドします。

しかし、ここで何が起こるか:ここ

> c(4, 5, 6)[1] <- 10 
Error in c(4, 5, 6)[1] <- 10 : 
    target of assignment expands to non-language object 
> 

か:

> f <- function() c(4, 5, 6) 
> f()[1] <- 10 
Error in f()[1] <- 10 : invalid (NULL) left side of assignment 
> 

1だけ( 'X' のような)というデータ構造体に値を割り当てることができるように私には思えるが。

私はR言語コアを実装しようとしているので、私はそのような割り当てに対処する方法がわかりません です。事前

+1

素晴らしい質問だこと。いくつかの答えはここで少しわかるかもしれません:http://stackoverflow.com/questions/10449366/levels-what-sorcery-is-this –

答えて

16

という名前のデータ構造(「x」など)にのみ値を割り当てることができます。

?"<-"のドキュメントが言うことを正確です:

説明:

Assign a value to a name. 

x[1] <- 10x <- c(5, 6, 7)と同じ機能を使用していません。前者は[<-、後者は<-です。

+1

ああ。しかしパーサーが変化するようには思えない 間のx < - 2 と xは、[1] < - 2 'canonical'機能は私に ' < - '(X、2) を与えるので、 '<'( '['(x、1)、2) 私はインタプリタが左辺に何とかディスパッチすると思います。 –

14

ありがとうございます、無名関数に変更を加えることができますが、匿名のベクトルへの割り当てはありません。 Rも名前付きの一時的なコピーを作成し、その事実を反映するエラーメッセージが表示されることがあります。

x[3:5] <- 13:15 
# The result of this commands is as if the following had been executed 
`*tmp*` <- x 
x <- "[<-"(`*tmp*`, 3:5, value=13:15) 
rm(`*tmp*`) 

とオブジェクト名として *tmp*使用しないように警告があります:あなたはそれが「サブセットの割り当て」のため、代入の他の形態のための式の評価を扱う21ページの R language definitionでこれを読むことができます [<-

15

this questionに対する@ Owenの回答によれば、x[1] <- 10は本当に2つのことをしています。 [<-関数を呼び出しており、その呼び出しの結果をxに代入しています。

だから、あなたはあなたのc(4, 5, 6)[1] <- 10結果が達成したいもの:

> `[<-`(c(4, 5, 6),1, 10) 
[1] 10 5 6 
+0

'< - '関数は実際には2つ以上の引数をとることのできる中置関数であり、そのうちの最初のものは真のR名(文字ベクトルではありません)です。 –

関連する問題