R in a Nutshellメモ (2)

前回

まとめ

油断するとメモった内容すら忘れるということに気付いたので先にメモった部分の要点まとめておきます.

  • with()やwithin()を使えばattach()せずにデータフレームの成分に名前だけでアクセスできる
  • 関数の引数のデフォルト値は関数定義後でも割と簡単に変更できる
  • 引数の名前は複数にマッチしなければ省略できるが,たとえ複数にマッチしても一意に決定できるならやっぱり省略できる

withとwithin

with()関数を用いると,第一引数に与えたデータフレームやリストを環境として扱い,その環境の中で第二引数に与えた式を評価することができる.
すなわち,引数として与えた式中ではデータフレームの列名のようなシンボルを直接扱える.

> x <- data.frame(a = 1:3, b = 11:13, c = 21:23)
> with(x, a + b + c)
[1] 33 36 39

within()関数はwith()に似ているが,値を返す場所がもとの環境になる.
例えば引数に代入式などを与えて新たなオブジェクトを作成すれば,それが第一引数に与えたリストやデータフレームの中に出現する.

> within(x, d <- a + b + c)
  a  b  c  d
1 1 11 21 33
2 2 12 22 36
3 3 13 23 39

ただし,実際にデータフレームxが変更されるわけではない.

> x
  a  b  c
1 1 11 21
2 2 12 22
3 3 13 23

関数

関数の引数と本体はそれぞれargs(),body()関数を通じて参照できる.

> f <- function(x=1, y=2, z=3) x + y + z
> args(f)
function (x = 1, y = 2, z = 3) 
NULL
> body(f)
x + y + z

引数とデフォルト値を操作するための方法も用意されている.
formals()関数は引数として与えられた関数の引数とそのデフォルト値をpairlist形式で返し,また値の変更も可能である.

> formals(f)
$x
[1] 1

$y
[1] 2

$z
[1] 3

> formals(f)$x <- 10
> f
function (x = 10, y = 2, z = 3) 
x + y + z

引数とその引数を対にしたリストが作製出来れば,formals()関数を通じて引数を操作する際に便利だろう.
alist()関数を用いれば引数とそのデフォルト値を対にしたリストを作製できる.

> (arg.list <- alist(x=100, y=200, z=))
$x
[1] 100

$y
[1] 200

$z


> formals(f) <- arg.list
> f
function (x = 100, y = 200, z) 
x + y + z

上記の例のようにデフォルト値を指定しない場合でもz=のように=を書く必要がある.

名前付き引数

関数に与える実引数がどの仮引数に対応するかを指定する方法として,Rには3つの方法が用意されている.

  1. 名前を完全に指定する
  2. 名前を部分的に指定する
  3. 並び順により指定する

名前を部分的に指定する場合,引数の名前を先頭から何文字か指定するだけでよい.
ただし,指定した文字で引数が一つに決定できなければいけない.

> f <- function(arg1=1, arg2=2, hoge="fuga"){
+   print(paste("arg1:", arg1))
+   print(paste("arg2:", arg2))
+   print(paste("hoge:", hoge))
+ }
> f(h=10)
[1] "arg1: 1"
[1] "arg2: 2"
[1] "hoge: 10"
> f(arg=123)
 以下にエラー f(arg = 123) :  引数 1 が複数の仮引数に一致します 

しかし,複数の仮引数にマッチする文字列であっても,他の引数が正しく指定されており曖昧さが無い場合には許される.

> f(arg=123, arg1=456)
[1] "arg1: 456"
[1] "arg2: 123"
[1] "hoge: fuga"