<< トップページへ

<< 目次へ

最終更新日: 2010.8.15

変数と代入



 変数とは数字や文字を格納することができる箱だと想像すればよいでしょう。例えば、Microsoft Excelのワークシートにはセルと呼ばれるマスがたくさんあります。その1つ1つのセルの中に数字を入力したり、文字を入力したり、少し使い慣れている人は数式(関数)を入力したりするでしょう。基本的にはそれと同じで、Rにも目に見えないセルが存在しており、そのセルの中にExcelと同じように数字、文字、あるいは関数を入力することができるのです。そこでまずは変数に数字と文字を代入してみましょう。ここで代入という言葉を使いましたが、代入とは文字通り変数に数字や文字を入れることで、別の言い方で格納するともいいます。

> x <- 244      # 変数xに244を代入する
> x             # xの中身を確認すると、
[1] 244         #  244と表示される。

> x <- "moji"   # 変数xに改めてmojiを代入する " "でくくるのを忘れずに!!
> x             # 同じくxの中身を確認してみると、
[1] "moji"      #  新しくmojiが代入されていることが分かる。

 さて代入には <- を使います(左向きの矢印みたいでしょう?)。この矢印みたいな記号が「変数に〜を代入せよ」という命令をR側に出すための役割をしてくれるのです。他の多くのプログラミング言語では = が使われますが、もちろんRでも同様に使うことができます。しかし、これは様々な理由によって使うべきではないといえます。またコードの可視性という観点から、変数、代入演算子(<-)、数字(あるいは文字、関数)の間にスペースを入れることをおススメします。

> # こうしたコードは見にくい!!
> x<-244
> x<--9.18

> # 適切なスペースを入れてあげると断然、見やすくなる!!
> x <- 244
> x <- -9.18

 ところで先ほどからずっとxという変数にのみ代入していますが、変数に新たな別のモノを代入すると、変数の中身が更新されて、かつて格納されていたモノは消えてしまうのです。したがって、変数の中身を保持しておきたい場合には別の変数を用意して、それに代入するべきといえます。変数の名前は基本的に何でも良いのですが、

というものがあります。例えば変数として使用できない名前の代表例として、数字だけによるものがあげられます。もしくは変数名の先頭に数字がくるものも使うことができません。

> # 数字のみによる変数名は使えない
> 5 <- 1
 以下にエラー 5 <- 1 :  代入の左辺が不正(do_set)です

> # 先頭に数字がくる変数名も使えない
> 3g <- 0
 エラー:   予想外の  シンボル  です  ( "3g" の)

 一方で変数として使用するのが適切でない名前としては、既に定義されている関数名があげられます。例えばt検定を行うためのt.test()という関数がありますが、この関数名であるt.testは使えなくはありませんが、使うべきではありません。というのも、こうした重複した変数名を使ってしまうと予期しない事態が発生する可能性があるからです。注意すべきは、例えばtという変数名も用いるべきではありません。なぜなら、これは転置行列を作るためのt()という関数名として既に用いられているからです。こうした一見すると何に使われているか分からないものもありますから、不安なときは事前にその名前が使われていないかどうかを確認しておくことよいでしょう。

# tという名前は既に使われているので、使うべきではない。
> t
function (x) 
UseMethod("t")
<environment: namespace:base>

# rという名前は使われていないので、使っても大丈夫。
> r
 エラー:  オブジェクト 'r' がありません

 ここでエラーメッセージの中に「オブジェクト’r’がありません」と出てきました。オブジェクトとは直訳すると対象物などと訳せますが、要するにモノなのです。イメージ的にはオブジェクトは生命を与えられたモノと考えてもよさそうです。例えば以下の実行例を見てみてください。

> # jに何が入っているか確認してみると何も入っていない
> j
 エラー:  オブジェクト 'j' がありません

> # jに1を代入して確認すると、当然だが1が格納されている。 
> j <- 1
> j
[1] 1

> rm()という関数を使って、オブジェクトを消去する。
> rm(j)

> # 改めて確認すると中身がなくなっている
> j
 エラー:  オブジェクト 'j' がありません

 最初の段階ではjという器に生命は注ぎ込まれていないので「オブジェクト’j’がありません」となります。そこでjという器に1という生命を注ぎ込むと新たな生命(オブジェクト)jが誕生します。さらにrm()という関数を使ってjの中に存在する生命を消し去ってしまうと、また最初と同じくjという生命(オブジェクト)は存在していないことになってしまうわけです。こういった作業をオブジェクトの生成と削除といいます。

 細かいことですが厳密にいうと、変数に値を代入することとオブジェクトを生成することとは少し違います(勘違いしてしまいそうですが・・・)。

> dat  # オブジェクトdatは存在しない
 エラー:  オブジェクト 'dat' がありません

> dat <- 123   # オブジェクトの生成

> dat <- 456   # オブジェクトの更新

> rm(dat)      # オブジェクトの削除(消去)

> dat  # オブジェクトdatは存在しない
 エラー:  オブジェクト 'dat' がありません

 初めはdatというオブジェクトが存在しておらず、datに123を代入することで新たなオブジェクトdatが生成されました。次に改めてdatに456が代入されていますが、これはオブジェクトの生成とはいわず、オブジェクトの更新といいます。だから、単に変数に値を代入することをオブジェクトの生成とはいわないということです。当然、rm(dat)とすればオブジェクトdatは削除(消去)されます。


◆ 確認してみよう ◆