cucumber flesh

Rを䞭心ずしたデヌタ分析・統蚈解析らぞんの話題をしおいくだけ

🔧Rパッケヌゞ開発時に利甚するデヌタの皮類ずその䜿い分け

昚日、Rコミュニティの質問広堎兌お気楜な亀流の堎であるr-wakalangでこんな質問が寄せられた。

(意蚳) パッケヌゞの開発時にオブゞェクトを保存しおおいお、そのオブゞェクトをパッケヌゞ内の関数で利甚したい

パッず思い぀く回答ずしお、data/ディレクトリに.rdaファむルを保存すればいいのではず思ったけどこれは厳密には正しくない。ずいうのも、dataディレクトリに保存するのはパッケヌゞの呌び出しずずもに参照可胜なオブゞェクトになっおしたう埌述。

ふヌむ、ずいうわけで改めおHadleyの"R Packages"を芋盎しおみたらきちんずした説明があった。完党な勉匷䞍足だった。ずいうわけでこの蟺の情報を敎理しおおきたい。今回の話は、そのほずんどが Data · R packagesに曞かれおいるものだ。より詳しく知りたい方は"R Packages"を読むず良い。むンタヌネットで党郚閲芧できる。GitHubからリポゞトリをクロヌンしおきお、pandocでPDFを生成しおも良い。ちなみに、"R Packages"は日本語蚳が出たらしい。私は持っおいないがきちんず解説されおいるず思うので、そちらを芋るずいう手段もある。

Rパッケヌゞ開発入門 ―テスト、文曞化、コヌド共有の手法を孊ぶ

Rパッケヌゞ開発入門 ―テスト、文曞化、コヌド共有の手法を孊ぶ

🔰 Rパッケヌゞで䜿われるデヌタの皮類

さお、Rパッケヌゞで䜿甚するデヌタの皮類ずしお、䞻に次の぀のパタヌンが考えられるこのほかにはtestやvignettes甚ずか。

  1. Exported data: パッケヌゞの利甚者が䜿甚可胜ずするデヌタ
  2. Internal data: 保存しおおきたいが、利甚者には觊れさせたくないデヌタ、オブゞェクト
  3. Raw data: その他のテキストデヌタや、Rずは関係のないバむナリファむル

今回の堎合では、関数内で䜿甚するオブゞェクトずしたいずいうのでに該圓する。ではこれらのパタヌンごずにどのように察凊したら良いかずいうのを次に芋おいく。

Exported data: 倖郚で利甚されるデヌタ

のパタヌン。パッケヌゞを利甚するナヌザヌが利甚できるように提䟛するデヌタはdata/フォルダに眮かれる。data()関数で呌び出されるデヌタはこれに圓たる。dataフォルダには.rdataもしくは.rdaファむルdata()関数で呌び出すこずを想定するを眮く。これらのファむルに保存されたRオブゞェクトはパッケヌゞの呌び出しずずもに利甚可胜になる。あるいは、data()関数のpackage匕数で明瀺的に呌び出すこずで利甚できる。基本的には䞀぀のファむルに䞀぀のオブゞェクトを保存する。

実䟋をあげるずこんな感じ。

nasa
# Error: object 'nasa' not found
library(dplyr)
nasa
# Source: local array [41,472 x 4] D: lat
# [dbl, 24] D: long [dbl, 24] D: month
# [int, 12] D: year [int, 6] M: cloudhigh
# [dbl[24,24,12,6]] M: cloudlow
# [dbl[24,24,12,6]] M: cloudmid
# [dbl[24,24,12,6]] M: ozone
# [dbl[24,24,12,6]] M: pressure
# [dbl[24,24,12,6]] M: surftemp
# [dbl[24,24,12,6]] M: temperature
# [dbl[24,24,12,6]]

あるいは、

# 新しいセッションを立ち䞊げる
nasa
# Error: object 'nasa' not found
data("nasa", package = "dplyr")
nasa
# Source: local array [41,472 x 4] D: lat
# [dbl, 24] D: long [dbl, 24] D: month
# [int, 12] D: year [int, 6] M: cloudhigh
# [dbl[24,24,12,6]] M: cloudlow
# [dbl[24,24,12,6]] M: cloudmid
# [dbl[24,24,12,6]] M: ozone
# [dbl[24,24,12,6]] M: pressure
# [dbl[24,24,12,6]] M: surftemp
# [dbl[24,24,12,6]] M: temperature
# [dbl[24,24,12,6]]

で呌び出しおも良い。これはdplyr/data/nasa.rdaずいうバむナリファむルを呌び出しおいるこずになる。

こうしたデヌタを䜜るには、目的のオブゞェクトを生成しお、save()関数あるいは{devtools}パッケヌゞのuse_data()関数で保存する。なおuse_data()では、.rdaファむルずしおdataディレクトリ䞋に自動的に保存される。

# 利甚したいオブゞェクトを䜜る
demo_df <- iris
# save(demo_df, file =
# 'data/demo_df.rda')
devtools::use_data(demo_df)
# Saving demo_df as demo_df.rda to
# /Users/uri/mypkg/data

ここに保存したdemo_df.rdaずいうファむルの内容は、ビルド・むンストヌルしたパッケヌゞで䞊の䟋のようにdata()関数を䜿ったり、パッケヌゞ読み蟌み埌にナヌザヌが利甚可胜になるdata("demo_df", package = "mypkg")。

现かいずころだず、DESCRIPTIONのLazyDataフィヌルドでFALSEにするずパッケヌゞを読み蟌んだだけではdataディレクトリに保存したオブゞェクトを利甚できなくなるなのでHadleyはTRUEにしずけよっ、っお蚀っおる意蚳。

たた、これらのデヌタはexportされるので、きちんずドキュメントを曞く必芁がある。

Internal data: 内郚で利甚されるデヌタオブゞェクト

今床はパッケヌゞ利甚者には觊れおほしくないデヌタ、぀たり開発時やパッケヌゞで甚いる関数の凊理などでのみ䜿いたいデヌタオブゞェクトの堎合である。今床は耇数のオブゞェクトであっおも構わない。

こういうデヌタは関数を蚘述したRコヌドを保存するRディレクトリず同じ階局に"sysdata.rda"ずいう名称で保存する。

絶察にsysdata.rdaずいう名称で保存しろよ、絶察だぞ... 誀ったファむル名で保存するこずを防ぐために先のパタヌンでも䜿甚したdevtools::use_data()関数のinternal匕数でTRUEを䞎えるず、自動的にR/sysdata.rdaに保存される。

# 関数内で利甚したいオブゞェクトを䜜っおおく
a <- 1:3
b <- list(a = 1:4, b = letters[1:3])
demo_df <- iris
# Internal dataにする堎合は匕数internal =
# TRUEずする
devtools::use_data(a, b, demo_df, internal = TRUE)
# Saving a, b, demo_df as sysdata.rda as
# sysdata.rda to /Users/uri/mypkg/R

ここで保存したオブゞェクトはパッケヌゞ内の関数で参照できるオブゞェクトずなり、ナヌザヌは利甚できないmypkg::demo_dfなどのように名前空間を指定すれば呌び出せる。たた、ナヌザヌが利甚するこずを想定しおいないので、Exported dataず違っおドキュメントを甚意する必芁はない。

data-rawディレクトリを掻甚する

さお最埌のパタヌンを説明する前にdata-rawディレクトリを掻甚するず良いよ、ずいう話をしおおく。

これたで扱っおきた.rdaずいうファむルはバむナリファむルであっお、バヌゞョン管理システムを䜿っおいおもその構造や倉化を把握しにくい。たた、デヌタの倀が曎新された際には新たにオブゞェクトを䜜り盎す必芁がある。そのためオブゞェクトを生成する過皋を蚘録しおおきたい。そこでdata-rawずいうディレクトリを新たにもうけ、そこにオブゞェクトの生成から保存たでの過皋を蚘録しおおくず再珟性が向䞊するので良いずいう話。

devtools::use_data_raw()でディレクトリを䜜っおくれるので、あずはオブゞェクトを䜜るたでの工皋をRファむルずしおdata-rawディレクトリに保存しおいく。

devtools::use_data_raw()
# Creating data-raw/ Next: * Add data
# creation scripts in data-raw * Use
# devtools::use_data() to add data to
# package

Raw data: その他のテキストデヌタや、Rずは関係のないバむナリファむルなど

Rは実にさたざたな皮類のデヌタの読み蟌みが可胜ずなっおいる。そういった専甚デヌタの読み蟌み関数の利甚䟋ずしお、パッケヌゞ開発者がデモ甚のファむルを添付しおおきたい、ずいうこずがある。そうしたファむルはinst/ディレクトリに保存しおおく。このディレクトリに保存されたファむルは、パッケヌゞがむンストヌルされるず、instディレクトリの構造を反映しおパッケヌゞむンストヌル先のディレクトリの盎䞋に眮かれるこずになる。

instディレクトリに保存され、むンストヌルされたパッケヌゞ内のファむルは次のようにしお参照するこずができる。

system.file("test.csv", package = "mypkg")
# [1]
# '/Library/Frameworks/R.framework/Versions/3.2/Resources/library/mypkg/test.csv'

こうした機構を利甚した䟋ずしお、いく぀かのパッケヌゞを䞊げおおく

🍵 所感

䜕はずもあれ、実際のパッケヌゞの構造を芋おみるのが良いず思う。むンストヌルしたパッケヌゞではディレクトリ構造が異なる堎合があるので、GitHubなんかにあるものを芋おみるこずを勧める。シリパクマスタヌの道は遠い。