- function 関数はR のコードをまとめて一つの関数を作る関数(ややこしい言い方ですが)。
- Rになれてくると、ルーチン作業が増えてきて、できれば一発で終わらせたい衝動にかられます。そのとき、この処理をfunction関数でまとめることでスクリプトがシンプルになって、コーディングが読みやすくなります。
- function関数には、引数を指定できるし、function関数の中で使う関数(あ〜ややこしい)の引数も引き継げます。もちろん、引数にデフォルト値を与えることもできます。
- function 関数はfunction(引数1, 引数2, 引数3, ...) で定義します。function関数内で呼び出す関数の引数もここで指定します。このとき、引数に型の指定は不要で、function(x){...以下のスクリプトで引用する関すう次第で、自動的に型が決まってくる。
- 自作関数の例を
> mn_sd <- function(x){ # mn_sdというオブジェクトに関数のスクリプトを放り込むイメージ + c("mean"=mean(x),"sd"=sd(x)) + } # この関数はone-linerで書くこともできます。 # mn_sd <- function(x) c(mean(x), sd(x)) > x <- 1:10 > mn_sd(x) mean sd 5.500000 3.027650
で、
- 呼出し関数の引数をすべて記述するのは大変なので、"..."と記入することで省略可能です。
> mn_sd <- function(x, ...) c("mean"=mean(x,...),"sd"=sd(x,...)) # meanとsdの引数を引き継いでいる > x <- c(1:10, NA) > mn_sd(x, na.rm=TRUE) mean sd 5.50000 3.02765
- 引数にデフォルト値を指定するときは、引数= 値(数値、文字可) とします。
> mn_sd <- function(x, na.trim=1){ + ifelse(na.trim==1, na.rm <- TRUE, na.rm <- FALSE) + c("mean"=mean(x,na.rm=na.rm),"sd"=sd(x,na.rm=na.rm)) + } # meanとsdの引数を引き継いでいる > x <- c(1:10, NA) > mn_sd(x) # na.trim <- 1となっている mean sd 5.50000 3.02765 ############################### #こういうこと > mn_sd(x, na.trim=0) #1でなければなんでもいいのですが… mean sd NA NA > mn_sd(x, na.trim=1) mean sd 5.50000 3.02765
なれてくると、いろいろ引数を作ったりしたくなるのですが、function関数で使う関数の引数をfunction(...)で違う目的で使ったりすると、エラーを吐くことがあるので注意