日々のつれづれ

不惑をむかえ戸惑いを隠せない男性の独り言

function関数の使い方

  • 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(...)で違う目的で使ったりすると、エラーを吐くことがあるので注意