15

R言語で割り当てがどのように機能するのか疑問に思っています。

次のRシェルセッションについて考えてみます。

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

私は完全に理解しています。ベクトル(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
>

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

私が尋ねている理由は、私がR言語コアを実装しようとしていて、そのような割り当てをどのように処理するかわからないためです。

前もって感謝します

4

3 に答える 3

16

この質問に対する@Owenの回答によると、x[1] <- 10実際には2つのことを行っています。関数を呼び出しており[<-、その呼び出しの結果をxに割り当てています。

c(4, 5, 6)[1] <- 10したがって、結果を達成したいのは次のとおりです。

> `[<-`(c(4, 5, 6),1, 10)
[1] 10  5  6
于 2012-05-23T13:22:28.127 に答える
16

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

それはまさにドキュメントが?"<-"言うことです:

説明:

 Assign a value to a name.

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

于 2012-05-23T12:33:41.597 に答える
14

匿名関数に変更を加えることはできますが、匿名ベクトルへの割り当てはありません。Rでさえ、名前を使用して一時的なコピーを作成し、その事実を反映したエラーメッセージが表示されることがあります。これは、21ページの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*ます。これは、次の呼び出し時に上書きされるためです。[<-

于 2012-05-23T12:30:42.657 に答える