=
代入演算子と<-
Rの違いは何ですか?
この例が示すように、演算子が少し異なることを私は知っています
x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"
しかし、これが唯一の違いですか?
=
代入演算子と<-
Rの違いは何ですか?
この例が示すように、演算子が少し異なることを私は知っています
x <- y <- 5
x = y = 5
x = y <- 5
x <- y = 5
# Error in (x <- y) = 5 : could not find function "<-<-"
しかし、これが唯一の違いですか?
代入演算子を使用して関数呼び出しで引数値を設定すると、代入演算子の違いがより明確になります。例えば:
median(x = 1:10)
x
## Error: object 'x' not found
この場合、x
は関数のスコープ内で宣言されているため、ユーザーワークスペースには存在しません。
median(x <- 1:10)
x
## [1] 1 2 3 4 5 6 7 8 9 10
この場合、x
はユーザーワークスペースで宣言されているため、関数呼び出しの完了後に使用できます。
<-
S-Plusの(非常に)古いバージョンとの互換性のために(関数シグネチャ以外で)割り当てに使用することについて、Rコミュニティの間で一般的な好みがあります。スペースは次のような状況を明確にするのに役立つことに注意してください
x<-3
# Does this mean assignment?
x <- 3
# Or less than?
x < -3
ほとんどのRIDEには、入力を<-
容易にするためのキーボードショートカットがあります。 Ctrl+ =Architectで、Alt+ -RStudioで(Option+ -macOSの下で)、Shift+ -(アンダースコア)emacs+ESSで。
書き込み=
を<-
希望するが、公開されているコード(CRANなど)に一般的な割り当て記号を使用したい場合はtidy_*
、パッケージ内の関数の1つを使用formatR
して自動的にに置き換えること=
ができます<-
。
library(formatR)
tidy_source(text = "x=1:5", arrow = TRUE)
## x <- 1:5
「なぜx <- y = 5
エラーをスローするのにエラーをスローしないのx <- y <- 5
か」という質問に対する答え。「パーサーに含まれる魔法にかかっています」です。Rの構文には、何らかの方法で解決する必要のある多くのあいまいなケースが含まれています。パーサーは、使用されたかどう=
か<-
に応じて、式のビットをさまざまな順序で解決することを選択します。
何が起こっているのかを理解するには、割り当てが割り当てられた値をサイレントに返すことを知っておく必要があります。たとえば、明示的に印刷することで、それをより明確に確認できますprint(x <- 2 + 3)
。
次に、割り当てにプレフィックス表記を使用すると、より明確になります。それで
x <- 5
`<-`(x, 5) #same thing
y = 5
`=`(y, 5) #also the same thing
パーサーは次のように解釈x <- y <- 5
します
`<-`(x, `<-`(y, 5))
そうなると予想されるかもしれませx <- y = 5
ん
`<-`(x, `=`(y, 5))
しかし実際にはそれは次のように解釈されます
`=`(`<-`(x, y), 5)
これは、ヘルプページに示されているように、=
がよりも優先順位が低いためです。<-
?Syntax
GoogleのRスタイルガイドは、割り当ての「=」を禁止することで問題を単純化します。悪い選択ではありません。
https://google.github.io/styleguide/Rguide.xml
Rマニュアルでは、5つの代入演算子すべてについて詳しく説明しています。
http://stat.ethz.ch/R-manual/R-patched/library/base/html/assignOps.html
x = y = 5
x = (y = 5)
代入演算子は右から左に「グループ化」するため、はと同等です。これは機能します。意味:5をに割り当てy
、番号5を残します。次に、その5をに割り当てx
ます。
これは、機能しない、と同じで(x = y) = 5
はありません。意味:の値をに割り当て、の値をy
残しx
ますy
。そして、5を割り当てます、うーん...、正確には何ですか?
さまざまな種類の代入演算子を組み合わせると、 。<-
よりも厳密にバインドされ=
ます。したがって、x = y <- 5
と解釈されx = (y <- 5)
ます。これは理にかなっているケースです。
残念ながら、x <- y = 5
と解釈されますが(x <- y) = 5
、これは機能しません。
優先順位(バインディング)とグループ化のルールについては、を参照?Syntax
してください。?assignOps
John Chambersによると、オペレーター=
は「トップレベル」でのみ許可されます。つまり、のような制御構造では許可されないif
ため、次のプログラミングエラーは違法になります。
> if(x = 0) 1 else x
Error: syntax error
彼が書いているように、「制御式で新しい割り当て形式[=]を禁止すると、他のS割り当てよりも等しい演算子で発生する可能性が高いプログラミングエラー(上記の例など)を回避できます。」
「中かっこまたは余分な括弧のペアによって、周囲の論理構造から分離されている」場合は、これを行うことができますif ((x = 0)) 1 else x
。
演算子<-
と=
それらが評価される環境に割り当てます。演算子<-
はどこでも使用できますが、演算子=
は最上位レベル(たとえば、コマンドプロンプトで入力された完全な式)でのみ、または式のブレースリストの部分式の1つとしてのみ使用できます。
これにより、これら2つの演算子の違いを理解することもできます。
df <- data.frame(
a = rnorm(10),
b <- rnorm(10)
)
最初の要素については、Rに値と固有名が割り当てられていますが、2番目の要素の名前は少し奇妙に見えます。
str(df)
# 'data.frame': 10 obs. of 2 variables:
# $ a : num 0.6393 1.125 -1.2514 0.0729 -1.3292 ...
# $ b....rnorm.10.: num 0.2485 0.0391 -1.6532 -0.3366 1.1951 ...
Rバージョン3.3.2(2016-10-31); macOS Sierra 10.12.1
I am not sure if Patrick Burns book R inferno has been cited here where in 8.2.26 = is not a synonym of <- Patrick states "You clearly do not want to use '<-' when you want to set an argument of a function.". The book is available at https://www.burns-stat.com/documents/books/the-r-inferno/