餡子付゛録゛

ソフトウェア開発ツールの便利な使い方を紹介。

Rの関数をラッピング

Rは対話型インターフェイスなので、長々と関数に引数を指定するのは手間隙です。グローバル・オプションを設定したくなります。しかし、発展途上のライブラリが多いため、グローバル・オプションをつけると上手く動作しなくなったり、そもそもグローバル・オプションを参照しないライブラリがあったりします。こういう都合の悪いときに、やや強引にデフォルト値を設定する細工を考えてみました。

R言語では既に宣言されている関数や変数を再定義する事ができ、さらに再定義した関数内からもともと宣言されている関数を呼び出す事ができます。これを使って、read.tableのfileEncodingにデフォルト値を設定してみましょう。

read.table <- function(...){
  print("ラッパーを通しています(理解したらここは消してください)")
  # 可変長引数をリストに展開
  args <- list(...)
  # fileEncodingが存在しなければ、UTF-8をセット
  if(!("fileEncoding" %in% names(args))){
    args <- append(args, list("fileEncoding"="UTF-8"))
  }
  # ホンモノのread.tableを呼び出す
  # package:utils はホンモノがあるEnvironment
  do.call(get("read.table", env=as.environment("package:utils")), args)
}

これを .Rprofile *1に書いておけば、options(encoding="UTF-8")なしにデフォルトでUTF-8指定ができます。write.tableでも、他の関数でも同様にできます。なお、ラッピングする関数の環境(Environment)が分からない場合は、find("関数名")としてください。
しかし、こういうコーディング、MS-DOS時代の割り込み処理を思い出しますね!

*1: Windowsの場合は、%USERPROFILE%\Documents\.Rprofile になります。