Rは動的型付け言語なので、一般に変数の型を指定する必要はありません。既定の型はnumericで、通常は倍精度浮動小数点数として実装されています。32ビット整数を強制的に使うには、Lという接尾辞(Longの略)を付けます。
オブジェクトの「型」を取得するのは、歴史的な理由から、紛らわしくなることがあります。typeof()とclass()という関数は似ていますが、返す結果が少し異なることがあります。
typeof(50)
#> [1] "double" # more specific: an implementation detail
typeof(50L)
##> [1] "integer"
class(50)
#> [1] "numeric" # less specific: ignores implementation details
class(50L)
#> [1] "integer"
typeof()に似たmode()への言及を見かけることもあるでしょう。
mode()とstorage.mode()は無視してください。これらは後方互換性のために用意されているだけです。
代入演算子としては<-が推奨されます。RStudioで作業しているなら、キーボードショートカットのAlt-minusで入力できます。
x <- 42
avogadro <- 6.02e23
mystr <- "Hello, World!"
<-の代わりに=を使っても多くの場合は動きますが、いつもそうとは限らず、良くないスタイルなので避けるべきです。
演算子は多くの他の言語とおおむね似ていますが、%%と%/%は少し珍しいものです。この%という構文は、マクロとして実装された中置演算子を呼び出す方法です。
2 + 3 # 5
2 - 3 # -1
2 * 3 # 6
2 / 3 # 0.6666667
8 %/% 3 # 2 (integer division)
8 %% 3 # 2 (remainder)
2 ^ 3 # 8 (exponential)
Rでは、#で1行コメントが始まります。複数行コメント用の別の構文はありません。
関数を定義するには、次のようにします。
squareit <- function(x) {
x * x
}
関数は0個以上の引数を取ることができ、カンマで区切ります。function()には、引数がなくても括弧(())が必要です。
関数の引数には既定値を指定できますが、既定値のない引数の後に置く必要があり、既定値の代入には<-ではなく=を使います。あまり意味のない例ですが、次のようになります。
squareit <- function(x = 42) {
x * x
}
squareit()
#> [1] 1764
1行の関数本体では波括弧({ })は必ずしも必要ありませんが、付けるのが良いスタイルとされています。
上の例のように、Rは関数の最後の値を自動的に返します。
return()は、戻り値を明示するために、関数本体のどこでも使えます。指定した値をすぐに返し、関数本体の残りの式を実行せずに関数を終了します。
return()を明示的に呼び出す必要があるのは、通常、何らかの理由で関数を途中で抜けて特定の値を返したい場合だけです。例えば、if-else文の中で使う場合が考えられます。
ただし、コードスタイルとして明示的なreturnを好む開発者もいます。
関数の呼び出しは、多くの他の言語と同じです。
squareit(3)
#> [1] 9
今後のコンセプトで見ていきますが、結果の9は実際にはスカラー数値ではなく、長さ1のベクトルです。そのため、これがベクトルの先頭であることを示す[1]が付いています。
is.vector(9)
#> [1] TRUE
Rでは、ほとんどのものが何らかのベクトルです!
Rのコンソールでは、上の例は次のように表示されます。
> squareit(3)
[1] 9
このシラバスのドキュメントは、いくつかのRの教科書で使われている慣習にほぼ従っており、プロンプトを省いて結果をコメントで示しています。こうすると、コード例をコンソールにコピー&ペーストして実行しやすくなります。