Rのパッケージを作成してGitHubで管理する為のメモ
調べた内容を適宜追加していくので一部古い内容がある
roxygen2
やusethis
等も一緒にインストールされる. install.packages("devtools")
Add.gitignore
: R Add a license
: MIT License git remote add origin https://github.com/[アカウント名]/[リポジトリ名].git git branch -M main git push -u origin main
File -> New Project -> New Directory -> R package
として, Create a git repository
にcheckを入れてCreate Project
するとRパッケージの雛形が作られると同時にgitのローカルリポジトリが作られる. .git
というディレクトリができている. ターミナルからgit init
を実行してもできる. usethis::create_package
を実行する.# 雛形を作成 path <- "~/pub/bin/rpkg/hello" usethis::create_package( path = path, fields = list( Package="hello", # パッケージ名 Title="Exersice of R package development", # パッケージタイトル Version = "0.1.0", Author = "Shogo Konishi <hoge@gmail.com>", Maintainer="The package maintainer <hoge@gmail.com>", Description="Exersice of R package development", License='MIT + file LICENSE', Encoding="UTF-8", LazyData="true" ) )
RStudioからFile -> New Project -> Version Control -> Git
を選んで, Repository URL:
を入れてCreate Project
でローカルリポジトリーにクローンできる. 例えばローカルリポジトリを~/Rpkg/hello以下に作りたい場合、以下のように記入する.
https://github.com/shkonishi/hello
hello
~/Rpkg
```{bash echo=F}
tree -n
## ローカルリポジトリとリモートリポジトリを同期 - RStudioでNew Projectを作る際に`Create a git repository`にチェックを入れて`Create Project`すると, 付属のGitクライアントツールを使えるようになる. - Gitタブからよく使うgitコマンド, commit(ファイルの変更等をローカルリポジトリへ反映させる)や, push(ローカルリポジトリの変更をリモートリポジトリへ反映)することができる. - リモートリポジトリの登録`git remote add`はターミナルを起動して行う(ターミナルはRStudioのGitのタブの歯車マークから起動できる). - 登録した後で`Tools -> Project Options -> Git/SVN`を選択して`Origin`のところがリモートリポジトリのアドレスになっていることを確認する. - ローカルリポジトリ名を変更した場合リモートの新しいアドレスと対応させる`git remote set-url origein https://github.com/shkonishi/hoge.git` . ```{bash eval=FALSE} # # ターミナルから以下を実行 # git remote add origin https://github.com/shkonishi/hello.git # git commit -m "first commit" # git push -u origin master git remote add origin https://github.com/[アカウント名]/[リポジトリ名].git git branch -M main git push -u origin main # ローカルリポジトリ名を変更した場合リモートの新しいアドレスと対応させる git remote set-url origin https://github.com/shkonishi/test.git
ここまででRのパッケージがGitHubからダウンロード可能になっているので、インストールしてみる. リモートリポジトリにローカルリポジトリの変更が反映されているか確認する.
if (!identical(character(0), find.package("hello", quiet = T))) { remove.packages("hello") }
# GitHubからソースパッケージをダウンロード->ビルド->インストールする devtools::install_github("shkonishi/hello", quiet = T) # 試しに関数を実行してみる. library(hello) hello(n = 3)
最初にパッケージのメタデータ等のファイルを作成する. 以下の各種ファイルを編集.gitignore
, DESCRIPTION
, .Rbuildignore
必要に応じてLICENCE
, README.md
を作成する.
パッケージに変更を加えたら, だいたい以下の流れを繰り返す.
R/
ディレクトリに置く. devtools::document()
を実行する. NAMESPACE
とドキュメント(man/*.Rd
)が作られる.devtools::check
)cat(system("less .gitignore", intern = T), sep = "\n")
devtools::build
でビルドすると, ここにリストされているファイルはバンドルパッケージ(.tar.gz)に含まれない. .DS_Store
とかも書いておく. 正しく書くためにはusethis::use_build_ignore(".DS_Store")
とすれば書き込んでくれる. cat(system("less .Rbuildignore", intern = T), sep = "\n")
Author@R
: devtools::create
でDESCRIPTIONファイルを作る場合person
関数で埋め込む. 少なくとも一人の著者(aut), 保守担当者(cre)を書く. 雛形をRStudioで作成するとAuthor
と, Maintainer
に別れている. Imports
: パッケージの依存関係, 自動的にインストールされる. devtools::use_package("stats")
で自動的にDESCRIPTIONファイルに追記できる. Suggests
: パッケージでは使わないがテストで使う場合等, 自動でインストールされない. Depends
: devtools::check()
で警告が出る場合はここに依存バージョンを書くLicense
: MITライセンスの場合ファイルを置く必要がある. LazyData
: 外部データを遅延ロードするか否かlibrary(パッケージ名)
をしてもメモリ上に乗らない. # Importsの追記 devtools::use_package("stats") # Autho@R person("Shogo", "Konishi", email = "アカウント名@gmail.com", role = c("aut", "cre"))
. ├── DESCRIPTION ├── LICENSE ├── NAMESPACE ├── R │ ├── hello.R │ ├── mfuns.R │ ├── pois_mat.R │ └── sysdata.rda ├── README.Rmd ├── README.md ├── data │ └── pois_mat.rda ├── hello.Rproj ├── inst │ └── extdata │ └── pois.txt └── man ├── hello.Rd ├── mfuns.Rd └── pois_mat.Rd
Rスクリプトの中にroxygen形式でコメントを書いてから. devtools::document()
を作業中のプロジェクトの中で実行すると, ドキュメントファイルman/*.rd
およびNAMESPACE
ファイルが作られる. roxygen2::roxygenise('.', ..., clean=FALSE)
でもO.K.
#' @タグ名 内容
のように記述@title
タイトル @description
スクリプトの説明@details
関数がどのように機能するかについて詳細に説明. 引数の説明の後に表示される. #' Hello, World! #' #' Prints 'Hello, world!'. #' #' Repeat 'n' times printing for 'Hello, world!' #'
@usage
書式. ドキュメントとスクリプトで引数の順番が違っているとエラー(@paramがあれば不要)@param
引数. 一箇所で複数の引数の場合, @param x,y ...
@return
関数の出力 @examples
devtools::check()
で実行される. @references
リファレンス. \href{リンクアドレス}{リンク名}
. @export
はコード本体の直前に書く.@import
で非推奨, なるべく @importFrom
で関数名を指定する. @importFrom
に何も記述しないまま devtools::document()
を実行すると ~~importFrom("",)
ができてしまう. 手動で消す必要有.~~ エラーが出る. ::
を明示して, 依存パッケージの関数を利用するようにする. Checkの時間短縮にもなる.@export
#' @usage hello(n) #' @param n Number of replication #' @return Character vector, length of n #' @examples hello(3) #' @import base #' @importFrom base plot #' @importClassesFrom package class #' @import package #' @importFrom package function #' @importClassesFrom package class #' @export
Rのgrep関数のように、1つのドキュメントの中に複数の関数を記述する. 共通する引数をまとめて記載できる
#' Multiple functions #' #' multi-function in an Rd file. #' #' @param x a common argument #' @param y fun2 specific #' @param z fun3 specific #' #' @name mfuns #' #' @rdname mfuns fun1 <- function(x) x #' @rdname mfuns fun2 <- function(x, y) x + y #' @rdname mfuns fun3 <- function(x, y, z) x + y + z
examples
のコードをnot runにする.#'@examples #' \dontrun{ #' print(x) #' }
devtools::document()
するとNAMESPACEファイルに追記してくれる. 雛形の中に含まれているNAMESPACEファイルは削除しておく. # 対象パッケージから全ての関数をインポート(非推奨) import(ggplot2) import(dplyr) # 指定された関数をインポート importFrom(ggplot2, ggplot) importFrom(magrittr, %>%)
devtools::check()
を実行Check
を実行する。その際にオプションをつけて実行できる. RStudioでBuild -> More -> ConfigureBuildTools...
を選択してオプションを追加する. --as-cran
CRANチェックと同様のチェック. --no-manual
, PDFマニュアルを作成しない. --no-vignettes
vignetをチェックしない等.Install and Restart
を実行する. ?function名を実行してドキュメントを確認
リモートリポジトリと同期する. # documentファイルが作られる. NAMESPACEファイルに記述 devtools::document() # RStudioで [Check -> Install and Restart] library(hello) # ドキュメントを確認する. ?hello
... ... R CMD check results 0 errors | 0 warnings | 0 notes
packageDescription("パッケージ名", fields ="タグ名")
でDESCRIPTIONファイルの特定のフィールドを抜き出せる. # 自分のパッケージが依存しているライブラリを取得する mylibs <- unlist(strsplit(packageDescription("hello", fields = 'Imports'), ",\n")) # それぞれのパッケージのDESCRIPTIONファイルのLicenseフィールドを抜き出す. data.frame(license = sapply(mylibs, function(x)packageDescription(x, fields = 'License')))
バイナリデータを, data/
に置く.
usethis::use_data(obj)
でオブジェクトをR/
にエクスポート usethis::use_data(obj,internal=T)
で関数が利用するオブジェクトをエクスポート. データファイルをパッケージに含める.
inst/extdata
を自分で作成してその中におく. usethis::use_data(obj)
で data/
にエクスポートされる. usethis::use_data(obj, internal = T)
とする. R/sysdata.rda
ができる. ユーザーからは利用できない. R/
ディレクトリに置く. package名:::object名
で使用するtools::add_datalist(getwd(), force = T)
datalistファイルがdataディレクトリに作成される. 巨大なデータセットを含める場合datalistを作っておかないとインストールが遅くなるらしい. # データを作成 pois_mat <- matrix(rpois(10000, 10), nrow = 100) norm_mat <- matrix(rnorm(10000, 10), nrow = 100) # エクスポート # devtools::use_data(pois_mat, pkg = ".") usethis::use_data(pois_mat) # data/pois_mat.rda ができる. usethis::use_data(norm_mat, internal = T) # R/sysdata.rdaができる. # 関数の中で使う場合 mat <- hello:::norm_mat
R/
にバイナリデータのdocumentを作成する.pois_mat
というdataならばpois_mat.R
を作成devtools::document()
を実行. #' @docType data #' @usage data(pois_mat) #' @format An object of matrix with 100 rows and 100 colmns. #' @keywords datasets #' @references #' \href{https://github.com/shkonishi/hello/tree/master/man}{man} #' @examples #' data(pois_mat) "pois_mat"
inst/extdata
に置く場合system.file
を使って読み込む. パスを知らないと読み込めない. dir(paste0(.libPaths(), "/Biostrings/extdata"))
dir(paste0(.libPaths(), "/hello/extdata")) fp <- system.file("extdata/pois.txt", package = "hello") dat <- read.table(fp)
RStudio -> Preferences -> Code -> Diagnostics
でいくつかにcheckを入れれば, リアルタイムでいくつかのコードの校正箇所を指摘してくれる. Code -> Show Diagnostics
を実行するとMarkersに修正箇所が示される. lintr::lint_package()
でMarkersペインに, ファイルごとの修正すべき内容と行番号が表示される. 修正箇所をダブルクリックでその行にカーソルが移動する. 見ながらなおしていくと, 行番号と修正箇所が合わなくなるので, 末尾の行番号から修正していく. formatR
を使う formatR::tidy_app()
shinyアプリが立ち上がって, そこにコードをコピーしてTidy My Codeを実行するとコードが修正される. ggplotの+や, magrittrのパイプ処理別の改行を繋げてしまう. formatR::tidy_file("./R/script.R")
ファイル自体が書き換えられる. formatR::tidy_source()
クリップボードの内容を書き換えて返す. # lintr::lint_package() # devtools::spell_check() # formatR::tidy_source() # formatR::tidy_app()
README.mdは必須ではないが, 作ることが推奨されている.
このドキュメントはRStudioを用いてRmakdown形式で書いている. REAMDE.RmdをRStudioから作成する際にFrom Template
を選んでGitHub Document(Markdown)
を選択する. Knitボタンを押せばRコードのchunkが実行されてGitHubへの公開に適したマークダウンファイル(.md)に変換してくれる.
--- title: Rのパッケージを作成する output: github_document ---
```{bash eval = F} wget https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc chmod a+x gh-md-toc ./gh-md-toc ./README.md
## コミットメッセージについて - いい加減に日付ですましてきたが, 最低限変更内容がわかるようにする. - RStudio付属のGitクライアントを開いて, Commit messageのところに変更箇所がわかるように記述する. - 参考 - [コミットログ/メッセージ例文集100](https://gist.github.com/mono0926/e6ffd032c384ee4c1cef5a2aa4f778d7) - [Gitのコミットメッセージの書き方](https://qiita.com/itosho/items/9565c6ad2ffc24c09364) ### 直前のコミットにまとめる`git commit --amend -m "message"` - 直前のコミットメッセージを変更するのはRStudioからでも可能. GitペインからCommitを選択して`Amend previous commit` ```{bash eval=F} git log --oneline #コミットログを確認 git commit --amend -m "add binary data" # 直前のコミットメッセージを変更する
git rebase -i
HEAD~3
pick
を一括でfixup
(コミットメッセージの破棄)に変更する場合 :%s/pick/fixup/gc
:wq
セーブして終了. :q
セーブせずに終了git rebase
するとエラーになる. git rebase
でうまく行かない場合はリポジトリを削除することにする.```{bash eval=F}
git log --oneline
git rebase -i HEAD~3
git rebase -i "ハッシュ値"
:%s/pick/fixup/gc :wq
git rebase --abort
## リポジトリの削除 - リモートリポジトリの削除 - ログインしてから, Settingsのページの下の方にあるDelete this repositoryを選択し.リポジトリ名を入力して確定 - ローカルリポジトリの削除 - ローカルリポジトリがある場所で, `rm -rf .git` ## アクセストークンの期限切れ - Gitのパーソナルアクセストークンが期限切れだとRStudioからのpushで失敗した(Authentication failed)。トークンの再発行をしてから以下を実行するとトークンの設定のメニューが開く。 ```r credentials::set_github_pat()
sessionInfo()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.