R で関数のデフォルト引数を変更する #rstatsj

  • 9
    Like
  • 0
    Comment
More than 1 year has passed since last update.

R で、例えば read.table() は文字カラムを読み込むときに自動的にファクターに変換するという余計なことをしてくれます。

R
df <- read.table(text="hoge fuga")
df[,1]
結果
[1] hoge
Levels: hoge

ファクターに変換したくないときは、stringsAsFactors = FALSE と引数を指定して実行します。

R
df <- read.table(text="hoge fuga", stringsAsFactors=FALSE)
df[,1]
結果
[1] "hoge"

いちいち引数を指定するのががうざい人は、options(stringsAsFactors = FALSE) と一度実行しておくと、read.table()stringsAsFactors 引数のデフォルト値を変更することができます。

しかし、こうやって引数のデフォルト値を変更する方法は、read.table()stringsAsFactors 引数にしか使えません。
ここではもっと広い範囲で、任意の関数のデフォルト引数を変更する方法を紹介します。

formals()

といっても、やり方は簡単で、formals() 関数を使うとできます。
formals() は関数の引数を取得する関数です。

R
formals(read.table)
結果
$file


$header
[1] FALSE

$sep
[1] ""

$quote
[1] "\"'"

$dec
[1] "."

$numerals
c("allow.loss", "warn.loss", "no.loss")

... (長いので省略) ...

関数の引数とデフォルト値のリスト1が返ってきます。
この中から、stringsAsFactors だけを抽出してみます。

R
formals(read.table)$stringsAsFactors
結果
default.stringsAsFactors()

この default.stringsAsFactors() 関数は、getOption("stringsAsFactors") の値を返すだけの関数なので、options() で指定することによってこの値を変更することができるというのがわかります。

この formals()、実は左辺に置いて代入することで値を変更できます。
やってみましょう。

R
formals(read.table)$stringsAsFactors <- FALSE
formals(read.table)$stringsAsFactors
結果
[1] FALSE

変更できました。
それでは、最初のコードを実行してみましょう。

R
df <- read.table(text="hoge fuga")
df[,1]
結果
[1] "hoge"

stringsAsFactors = FALSE と指定しなくても、指定した場合の動作をするようになりました。

まとめ

くどいようですが、この方法はどんな関数でも適用できます。
例えば、正規乱数を発生させる rnorm() のデフォルト平均値は 0 ですが、これを 100 に変えてみます。

R
formals(rnorm)$mean <- 100
rnorm(1)
結果
[1] 100.3143

こんな感じで便利なので使ってみてはどうでしょうか?

Enjoy!

参考


  1. 正確にはペアリスト(pairlist