Rにおける「.」について 補足の補足

なんと、Rにもユーザーコミュニティが発足したらしいです。

"R"の歴史から、LispとしてのRの解説まで幅広い構成。すごいです。Emacs Lispもまともに読み書きできない自分としては、R使うならSchemeとかのLispも勉強するべきか・・・などと思ったりするのでした。

それはそうと。Rにおける「.」について質問があったそうで。いまどきの(?)Rにとっては「特別な意味はない」のだけど、全く意味がないかといえば、そういうわけでもなかったり。

1. S3形式でmethod dispatchするための区切り文字

詳しいことはこちらを参照。

いわゆるポリモーフィズム、実行時型情報。あるクラスに対して、そのクラス専用のメソッドを適切に識別して実行してくれるアレ。上のRjpWikiに書いてある通り、S4形式だとこういう書き方はしないのだけど、S3形式だと「.」を使ってクラスごとのメソッドを定義します。

method <- function(x){ # generic method
    UseMethod("method") 
}
method.default <- function(x){ # default
    writeLines(paste("I am default method : class", class(x)))
}
method.class1 <- function(x){ # method for "class1"
    writeLines("I am class1")
}
method.class2 <- function(x){ # method for "class2"
    writeLines("I am class2")
}

cls <- numeric(0)
method(cls)

class(cls) <- "class1"
method(cls)

class(cls) <- "class2"
method(cls)

実行結果

> method(cls)
I am default method : class numeric
> 
> class(cls) <- "class1"
> method(cls)
I am class1
> 
> class(cls) <- "class2"
> method(cls)
I am class2

まず、"method"という総称的(generic)関数を定義します。
つぎに、"method" + "." + "クラス名"という形式で、dispatchされるメソッドを定義していきます。".default"という名前にしておくと、当てはまるクラス名がなかったときにそれを実行する感じです。

2. シンボル名におけるアンダースコア "_" の代わり

R 1.9.0未満では、シンボル名にアンダースコア "_" を使うと文法エラーになったそうです。そのため、ほかの言語ではシンボル名の文字区切りとして使われることの多いアンダースコアが使えず、その代わりに"."を使っていたようです。

Underscore '_' is now allowed in syntactically valid names, and
make.names() no longer changes underscores. Very old code
that makes use of underscore for assignment may now give
confusing error messages.

https://stat.ethz.ch/pipermail/r-announce/2004/000787.html

今でも、make.names()に"allow_"というオプションがついていて、これをFALSEに設定すると"_"を"."に代えてくれます。

> make.names("hidamari_sketch", allow_ = FALSE)
[1] "hidamari.sketch"

make.names()のヘルプを見ると、S-PLUSでもアンダースコアは使えないみたいですね。

というわけで

他にもあるかな。あったらぜひ教えてください!