R で、例えば read.table() は文字カラムを読み込むときに自動的にファクターに変換するという余計なことをしてくれます。
df <- read.table(text="hoge fuga")
df[,1]
[1] hoge
Levels: hoge
ファクターに変換したくないときは、stringsAsFactors = FALSE と引数を指定して実行します。
df <- read.table(text="hoge fuga", stringsAsFactors=FALSE)
df[,1]
[1] "hoge"
いちいち引数を指定するのががうざい人は、options(stringsAsFactors = FALSE) と一度実行しておくと、read.table() の stringsAsFactors 引数のデフォルト値を変更することができます。
しかし、こうやって引数のデフォルト値を変更する方法は、read.table() の stringsAsFactors 引数にしか使えません。
ここではもっと広い範囲で、任意の関数のデフォルト引数を変更する方法を紹介します。
formals()
といっても、やり方は簡単で、formals() 関数を使うとできます。
formals() は関数の引数を取得する関数です。
formals(read.table)
$file
$header
[1] FALSE
$sep
[1] ""
$quote
[1] "\"'"
$dec
[1] "."
$numerals
c("allow.loss", "warn.loss", "no.loss")
... (長いので省略) ...
関数の引数とデフォルト値のリスト1が返ってきます。
formals(read.table)$stringsAsFactors
default.stringsAsFactors()
この default.stringsAsFactors() 関数は、getOption("stringsAsFactors") の値を返すだけの関数なので、options() で指定することによってこの値を変更することができるというのがわかります。
この formals()、実は左辺に置いて代入することで値を変更できます。
やってみましょう。
formals(read.table)$stringsAsFactors <- FALSE
formals(read.table)$stringsAsFactors
[1] FALSE
変更できました。
それでは、最初のコードを実行してみましょう。
df <- read.table(text="hoge fuga")
df[,1]
[1] "hoge"
stringsAsFactors = FALSE と指定しなくても、指定した場合の動作をするようになりました。
まとめ
くどいようですが、この方法はどんな関数でも適用できます。
例えば、正規乱数を発生させる rnorm() のデフォルト平均値は 0 ですが、これを 100 に変えてみます。
formals(rnorm)$mean <- 100
rnorm(1)
[1] 100.3143
こんな感じで便利なので使ってみてはどうでしょうか?
Enjoy!
参考
-
正確にはペアリスト(
pairlist)
この中から、stringsAsFactorsだけを抽出してみます。 ↩