Más contenido relacionado La actualidad más candente (20) Similar a 東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法 (20) 東京R非公式おじさんが教える本当に気持ちいいパッケージ作成法11. パッケージ開発のための パッケージ
• devtoolsパッケージ
–開発を楽にする
• roxygen2パッケージ
–Doxygenライクなin-source
ドキュメント生成
• testthatパッケージ
–単体テスト作成・実行
11 Welcome to Hadley world!!!
開発者:Hadley wickham
26. 大雑把なフォルダ/ファイルの説明
•DESCRIPTION
–パッケージの概要&他パッケージへの依存を書く
•NAMESPACE(ここではroxygen2で自動生成させる)
–どの関数をパッケージ外から使うか記述(含む他ライブラリ)
•manフォルダ
–.Rd形式のマニュアル(ここではroxygen2で自動生成させる)
•Rフォルダ
–自分で書いたRのコードを突っ込む
•XXXignore
–git/githubに対して監視させない無視させるファイルを設定
•XXX.Rproj
–Rstudio用の設定ファイル。テキストベースなので適当なエディ タでも編集可能
26
※赤字ファイル/フォルダを手でいじる、他は自動/GUIから設定 30. DESCRIPTIONファイルを修正
30
警告回避のため
Licenseは書換MUST
内部で使用するパッケー ジはImportsに記載して おく
※Imports/Dependsを書いておくと、CRANからinstall.packagesした時に、その他のパッケージも勝手にインストー ルしてくれる。Dependsの方は、自作パッケージを読み込むと自動でDependsに指定したパッケージまで読み込ん じゃう。一方、Importsの場合、自分で作ってるパッケージ内のみで指定したパッケージが使われるように良きに計 らってくれる。依存関係という意味で、Dependsは「XX以降のRじゃないとだめですよ~的な」Rのバージョン指定に のみ使われてるパッケージが結構ある on CRAN 33. のコードを書く
•[R/currentWeather.R]として以下を追加
33
一行目に関数の説明を書く。各項目は以下の ような意味合いで、 roxygen2パッケージにより HELPが自動生成される際に参照される。
@param:引数の説明
@return:返値の説明
@export:ある場合、この関数をパッケージの 外から呼び出せるようにする。逆にない(書か ない)と外から呼び出せない 34. •[R/ rOpenWeatherMap.R ]として以下を追加
34
のコードを書く
※ここを書いておくと、HELP・NAMESPACEファイルが自動生成される
※パッケージ名.Rにはパッケージ全体の説明、及び“依存ライブラリ”を書くのが一般的ぽい
※“依存ライブラリ“はNAMESPACEが自動生成される時に使われる 35. •[R/ rOpenWeatherMap.R ]として以下を追加
35
のコードを書く
”package名.R”ファイルにパッケー時の説明を 記述。ここに依存関係やパッケージの説明 (roxygen2パッケージにより作成されるHELP用) を書く。NULL必須(これもroxygen2用)
@name:パッケージ名
@doctype:”package”で。
@import:中で使用しているパッケージを記述 (NAMESPACEの自動生成に使用される)
※パッケージの依存関係は関数側に書く事も出来るが、 管理しやすいのでこちらのほうが良さげ 37. パッケージの構築(ビルド)
•Build & Reload[Ctrl + Shift + B]
–作成と読込(R CMD INSTALL )
•Check パッケージ[Ctrl + Shift + E]
–チェック(devtools::check)
•Test パッケージ[Ctrl + Shift + T]
–テスト(devtools::test)
•Document[Ctrl + Shift + D]
–資料作成(devtools::document)
37
※[]はキーボード・ショートカット、()は裏で走ってる(と思われる)コマンド
※devtoolsはその他にも関数がたくさんあるので、調べてみるといい 44. まとめ
1.三種の神器をインストール
2. Studioからプロジェクト作成
3.不要なファイルを削除
4.プロジェクトのオプション変更
5.DESCRIPTIONファイルの変更
6. のコードを書く&コメントを付ける
7.[Build&Load]で完成
44 49. 固めたパッケージのインストール
•固めたものを適当に配る
•インストールする側はinstall.packages 関数の引数を
–repos=NULL
–type=“binary” or “source”
としてローカルからインストール
49
#zipの時 install.packages("C:/dev/rOpenWeatherMap_1.0.zip", repos=NULL, type="binary") #tar.gzの場合 install.packages("C:/dev/rOpenWeatherMap_1.0.tar.gz", repos=NULL, type="source")
※パスは自分の環境に応じて適当に読み替える 50. まとめ
1. パッケージを配布可能なよう固めるために
1.tar.gzの場合:[Build Source Package]
2.zipの場合:[Build Binary Package]
を実行する。
2. インストールは以下のコマンド
1. tar.gzの場合
-install.packages(“固めたファイル", repos=NULL, type=“source")
2. zipの場合
-install.packages(“固めたファイル", repos=NULL, type=“binary“)
50 58. テストコードの中身
58
context("Current weather") test_that("ByCityName works.", { place <- "Tokyo,Japan" current.weather <- getCurrentWeatherByCityName(place) expect_equal(current.weather$name, "Tokyo") })
どういうテストの集まり なのかを記述。 通常1ファイル1context
expect_equal中身は等しくなって欲しい
※もっとテストしたい時はtest_thatをどんどん書いてCurrent weather系のテストを増やす
テストの作成。第 一引数はテスト名 61. テストコードの中身
•“Tokyo”を”Tokyooooo”にわざと変更
61
context("Current weather") test_that("ByCityName works.", { place <- "Tokyo,Japan" current.weather <- getCurrentWeatherByCityName(place) expect_equal(current.weather$name, "Tokyooooo") }) 74. この辺の試行錯誤記録
•「@useDynLib パッケージ名」をなくすと…
–Error in .Call(“パッケージ名_関数名”, PACKAGE = “パッケージ 名”) : “パッケージ名_関数名” not available for .Call() for package “パッケージ名“
でコンパイル通らない。これはDLL/SOを参照するようにしてないため
•「@importFrom Rcpp evalCpp」をなくすと…
–Error in transformSquare(std::vector<double> x) : function 'enterRNGScope' not provided by package 'Rcpp'
でコンパイル通らない。たぶん、Rcppへの参照周りがだめなんだと思 う、多分(Rcppのどっかのドキュメントに書いてあったはず)。
•Rcpp系の資料全般、特に以下が参考になった
–「Writing a package that uses Rcpp」
•http://cran.r-project.org/web/packages/Rcpp/vignettes/Rcpp-package.pdf
74 76. 呪文
• Studioのコンソールに入力
76
Sys.setenv("PKG_CXXFLAGS"="-std=c++0x")
※最近のRcppだと、ソースコード中に // [[Rcpp::plugins(cpp11)]] いれるでOK 78. こういうコードが書けるようになる
78 Before(C++03)
After(C++0X/11)
※書きなおした後、ふつーに[Build&Load]すればOK
※Rcpp11パッケージなんてのもあるけど、まだ追えてない・・・
※Windowsの場合、2014年7月現在、Rtoolsのgccが4.6.3なので-std=c++11使えない
※Linux/macならgccの新しい奴入れれば-std=c++11でいけると思う
※gccのヴァージョンとC++0x/C++11の対応などは以下参照
https://gcc.gnu.org/projects/cxx0x.html 79. 79
auto & lambda expression are already engaged!!! 84. vignetteの例
84
※ http://cran.r-project.org/web/packages/ggplot2/index.html より 87. R markdownファイルの例
87
※細かいR markdownの書き方は「kinitr, markdown」あたりでググれ
ここ以外はふつーの.Rmdと 同じ。vignetteIndexEnrtyは一 覧で見た時に表示される名 前を入力 88. 結果の確認方法-1
•以下を実行
•[inst/doc]フォルダのHTMLがそれ
88
※以下を参照した。 ※How to get RStudio to automatically compile R Markdown Vignettes? (http://stackoverflow.com/questions/19372260/how-to-get-rstudio-to-automatically- compile-r-markdown-vignettes)
devtools::build_vignettes() 103. 英語でいいなら、これ嫁
•[Advanced R] by Hadley Wickham
–http://adv-r.had.co.nz/
•Package Development(Rstudio)
–https://support.rstudio.com/hc/en-us/sections/200130627-package- Development
103 104. •Writing R Extensions
–http://cran.r- project.org/doc/manuals/R- exts.html
•How R Searches and Finds Stuff
–http://obeautifulcode.com/R/How-R-Searches-And-Finds-Stuff/
104
英語でいいなら、これ嫁 105. •Writing an R package from scratch
–http://hilaryparker.com/2014/04/29/writing-an-r-package-from- scratch/
105
英語でいいなら、これ嫁