tokyor / r-wakalang

Just chat or Q&A conversation related to R
56 stars 6 forks source link

stanのコンパイル済みオブジェクトをパッケージに組み込みたい #8

Closed kosugitti closed 8 years ago

kosugitti commented 8 years ago

初めまして。kousgittiといいます。 どこの誰に相談していいものやらわからないことがありましたので,Issueを立てさせていただきました。

現在rstanをつかったパッケージを作っております。 毎回のコンパイルが面倒で,かつ,モデルはほとんど変化しないので,stan_modelでコンパイルしたものを読み込んで使うようにしています。

saveRDS(stanmodel,file)としたものを,関数の中でreadRDS()で読み込みたいのですが,このとき"hoge.rds"ファイルをどこに置いたらいいのかわかりません。 detools::check()に,この手のファイルはinst>extdataにおくようにとご指導いただけるのですが,さてそれを実際にlibrary(mypkg)したときの関数が呼び出そうとすると「そんな場所はねえ!ファイルがねえ!」と叱られてしまいます。

.rdaや.RDataファイルにしてdataフォルダに置いても,パッケージの中の関数で参照できないのは同じで,途方に暮れております。

どうすれば良いか,アドバイスが頂きたく存じます。

DESCRIPTIONファイルやNAMESPACEファイルにも何か仕掛けが必要なんでしょうか。

予備知識が不十分なのは承知の上で,恥を忍んで投稿しております。 「ここ読め」でもいいので教えていただければ幸せます。

uribo commented 8 years ago

https://github.com/TokyoR/r-wakalang/issues/8#issuecomment-181270672 を参考にしてください。

ちょっと書き直します

必要なデータを.rdaとしてdataフォルダに保存するのは問題ないはずです。

data/hoge.rda に保存されているオブジェクトはパッケージが読み込まれると参照可能になります(ですので、本来はパッケージの名前空間を指定した方が行儀が良いはず)。

例えば、

a <- 1:3
b <- list(a = 1:4,
          b = letters[1:3])

save(a, b, file = "data/hoge.rda")

としてビルド・インストール後はmypkg::a でaの値が呼び出せます(呼び出せてしまう)。

hello <- function() {
  return(a)
}

mypkg::hello()
# Error in mypkg:::hello() : object 'a' not found

mypkg::a
# [1] 1 2 3

library(mypkg)
b
# $a
# [1] 1 2 3 4

# $b
# [1] "a" "b" "c"
uribo commented 8 years ago

さらに修正です。

R/sysdata.rda として保存しておけば、ユーザーは参照できないオブジェクトになるみたいです。

a
# Error: object 'a' not found
library(mypkg)
a
# Error: object 'a' not found

# 名前空間を指定すると呼び出せる
mypkg:::a
# [1] 1 2 3
 mypkg:::hello()
# [1] 1 2 3
hoxo-m commented 8 years ago

正式なやり方かどうかはわかりませんが、下記のようにすればアクセスできると思います。

readRDS(system.file("extdata", "hoge.rds", package = "mypkg"))
yutannihilation commented 8 years ago

細かいですが、extdata/は生のデータを置く場所なので、saveRDS()でシリアライズされたRのデータならdata/が正しい気がします。

参考:http://r-pkgs.had.co.nz/data.html#data-extdata

data/とかextdata/下にあるファイルの参照の仕方は、@hoxo-m さんの書き方をよく見かけますね。

@uribo さんが書いているように、R/sysdata.rdaとして保存しておくとパッケージ内では使うけどエクスポートされないデータになります。これはdevtools::use_data(..., internal = TRUE)とすると簡単に作ることができます。

参考:http://r-pkgs.had.co.nz/data.html#data-sysdata

kosugitti commented 8 years ago

ありがとうございました! ご紹介いただいた通りのやり方で,解決できました!

幾重にも御礼申し上げます。

解決できましたので,このイシューはこれで閉じさせていただきます。