S.Konishi 2023-11-15
devtools::check()
を実行R/
にバイナリデータのdocumentを作成する.inst/extdata
に置く場合git commit --amend -m "message"
git rebase -i
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
を実行する.RStudioからFile -> New Project -> Version Control -> Git
を選んで,
Repository URL:
を入れてCreate Project
でローカルリポジトリーにクローンできる.
例えばローカルリポジトリを~/Rpkg/hello以下に作りたい場合、以下のように記入する.
https://github.com/shkonishi/hello
hello
~/Rpkg
## .
## ├── 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
##
## 5 directories, 15 files
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
.
# # ターミナルから以下を実行
# 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からダウンロード可能になっているので、インストールしてみる. リモートリポジトリにローカルリポジトリの変更が反映されているか確認する.
# GitHubからソースパッケージをダウンロード->ビルド->インストールする
devtools::install_github("shkonishi/hello", quiet = T)
# 試しに関数を実行してみる.
library(hello)
hello(n = 3)
## [1] "Hello, world!" "Hello, world!" "Hello, world!"
最初にパッケージのメタデータ等のファイルを作成する. 以下の各種ファイルを編集.gitignore
,
DESCRIPTION
, .Rbuildignore
必要に応じてLICENCE
,
README.md
を作成する.
パッケージに変更を加えたら, だいたい以下の流れを繰り返す.
Rスクリプトを書いて, R/
ディレクトリに置く.
devtools::document()
を実行する.
NAMESPACE
とドキュメント(man/*.Rd
)が作られる.devtools::check
)## # History files
## .Rhistory
## .Rapp.history
##
## # Session Data files
## .RData
##
## # Example code in package build process
## *-Ex.R
##
## # Output files from R CMD build
## /*.tar.gz
##
## # Output files from R CMD check
## /*.Rcheck/
##
## # RStudio files
## .Rproj.user/
## .Rproj
##
## # produced vignettes
## vignettes/*.html
## vignettes/*.pdf
##
## # OAuth2 token, see https://github.com/hadley/httr/releases/tag/v0.3
## .httr-oauth
##
## # knitr and R markdown default cache directories
## /*_cache/
## /cache/
##
## # Temporary files created by R markdown
## *.utf8.md
## *.knit.md
##
## # Shiny token, see https://shiny.rstudio.com/articles/shinyapps.html
## rsconnect/
## .Rproj.user
devtools::build
でビルドすると,
ここにリストされているファイルはバンドルパッケージ(.tar.gz)に含まれない..DS_Store
とかも書いておく.
正しく書くためにはusethis::use_build_ignore(".DS_Store")
とすれば書き込んでくれる.## ^.*\.Rproj$
## ^\.Rproj\.user$
## ^\.DS_Store$
## ^README\.Rmd$
## ^README\.md$
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')))
## license
## stats Part of R 4.3.2
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
---
wget https://raw.githubusercontent.com/ekalinin/github-markdown-toc/master/gh-md-toc
chmod a+x gh-md-toc
./gh-md-toc ./README.md
git commit --amend -m "message"
Amend previous commit
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
でうまく行かない場合はリポジトリを削除することにする.#コミットログを確認 コミットのハッシュ値とメッセージを確認
git log --oneline
# 現在のブランチの先頭から 3 つのコミットを編集
git rebase -i HEAD~3
# 指定のコミット以降のコミットを編集
git rebase -i "ハッシュ値"
# pickをfixupに置換する
:%s/pick/fixup/gc
:wq
# 一連の処理を取り消す
git rebase --abort
rm -rf .git
credentials::set_github_pat()
sessionInfo()
## R version 4.3.2 (2023-10-31)
## Platform: x86_64-pc-linux-gnu (64-bit)
## Running under: Ubuntu 22.04.3 LTS
##
## Matrix products: default
## BLAS: /usr/lib/x86_64-linux-gnu/blas/libblas.so.3.10.0
## LAPACK: /usr/lib/x86_64-linux-gnu/lapack/liblapack.so.3.10.0
##
## locale:
## [1] LC_CTYPE=ja_JP.UTF-8 LC_NUMERIC=C
## [3] LC_TIME=ja_JP.UTF-8 LC_COLLATE=ja_JP.UTF-8
## [5] LC_MONETARY=ja_JP.UTF-8 LC_MESSAGES=ja_JP.UTF-8
## [7] LC_PAPER=ja_JP.UTF-8 LC_NAME=C
## [9] LC_ADDRESS=C LC_TELEPHONE=C
## [11] LC_MEASUREMENT=ja_JP.UTF-8 LC_IDENTIFICATION=C
##
## time zone: Asia/Tokyo
## tzcode source: system (glibc)
##
## attached base packages:
## [1] stats graphics grDevices utils datasets methods base
##
## other attached packages:
## [1] hello_0.1.0
##
## loaded via a namespace (and not attached):
## [1] miniUI_0.1.1.1 compiler_4.3.2 crayon_1.5.0 promises_1.2.0.1
## [5] Rcpp_1.0.8 stringr_1.4.0 callr_3.7.3 later_1.3.0
## [9] credentials_2.0.1 yaml_2.3.5 fastmap_1.1.0 mime_0.12
## [13] R6_2.5.1 curl_4.3.2 knitr_1.37 htmlwidgets_1.5.4
## [17] profvis_0.3.8 openssl_2.1.1 rprojroot_2.0.2 shiny_1.5.0
## [21] rlang_1.1.2 cachem_1.0.6 stringi_1.7.6 httpuv_1.6.5
## [25] xfun_0.41 sys_3.4 fs_1.5.2 pkgload_1.3.3
## [29] memoise_2.0.1 cli_3.6.1 withr_2.5.2 magrittr_2.0.3
## [33] ps_1.7.5 digest_0.6.33 processx_3.8.2 rstudioapi_0.13
## [37] xtable_1.8-4 askpass_1.1 remotes_2.4.2.1 devtools_2.4.5
## [41] lifecycle_1.0.4 prettyunits_1.1.1 glue_1.6.1 evaluate_0.23
## [45] urlchecker_1.0.1 sessioninfo_1.2.2 pkgbuild_1.3.1 rmarkdown_2.25
## [49] purrr_0.3.4 usethis_2.2.2 tools_4.3.2 ellipsis_0.3.2
## [53] htmltools_0.5.7
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.