Rのパッケージを作成してGitHubで管理する為のメモ
  調べた内容を適宜追加していくので一部古い内容がある


devtoolsのインストール

install.packages("devtools")

Gitのインストール, GitHubのアカウント作成, リモートリポジトリの新規作成

git remote add origin https://github.com/[アカウント名]/[リポジトリ名].git
git branch -M main
git push -u origin main

Rパッケージの雛形を作成しGitのローカルリポジトリとする

新規にRパッケージを作成する場合

# 雛形を作成
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以下に作りたい場合、以下のように記入する.

パッケージの中身を確認

```{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

パッケージをGitHubからダウンロードしてインストール

ここまでで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

cat(system("less .gitignore", intern = T), sep = "\n") 

.Rbuildignore

cat(system("less .Rbuildignore", intern = T), sep = "\n") 

DESCRIPTION

# 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.

roxygen形式のコメント書式

#' Hello, World!  
#' 
#' Prints 'Hello, world!'.  
#' 
#' Repeat 'n' times printing for 'Hello, world!'  
#' 
#' @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  

複数の関数を1つのRdファイルに含める

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)
#' }

NAMESPACE

# 対象パッケージから全ての関数をインポート(非推奨)  
import(ggplot2) 
import(dplyr)

# 指定された関数をインポート
importFrom(ggplot2, ggplot)
importFrom(magrittr, %>%)

devtools::check()を実行

# documentファイルが作られる. NAMESPACEファイルに記述
devtools::document() 

# RStudioで [Check -> Install and Restart]  
library(hello) 

# ドキュメントを確認する. 
?hello 
  ...
  ... 

  R CMD check results
  0 errors | 0 warnings | 0 notes

LICENSEを決める

# 自分のパッケージが依存しているライブラリを取得する 
mylibs <- unlist(strsplit(packageDescription("hello", fields = 'Imports'), ",\n"))

# それぞれのパッケージのDESCRIPTIONファイルのLicenseフィールドを抜き出す. 
data.frame(license = sapply(mylibs, function(x)packageDescription(x, fields = 'License')))

外部データをパッケージに含める

  1. バイナリデータを, data/ に置く.

    • usethis::use_data(obj) でオブジェクトをR/にエクスポート
    • usethis::use_data(obj,internal=T) で関数が利用するオブジェクトをエクスポート.
  2. データファイルをパッケージに含める.

    • inst/extdata を自分で作成してその中におく.

バイナリデータをdataディレクトリ置く場合

# データを作成    
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を作成する.

#' @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に置く場合

dir(paste0(.libPaths(), "/hello/extdata"))
fp <- system.file("extdata/pois.txt", package = "hello")
dat <- read.table(fp)

コードスタイル整形

# lintr::lint_package()
# devtools::spell_check()
# formatR::tidy_source()
# formatR::tidy_app()  

README.mdの作成

README.mdは必須ではないが, 作ることが推奨されている. このドキュメントはRStudioを用いてRmakdown形式で書いている. REAMDE.RmdをRStudioから作成する際にFrom Templateを選んでGitHub Document(Markdown)を選択する. Knitボタンを押せばRコードのchunkが実行されてGitHubへの公開に適したマークダウンファイル(.md)に変換してくれる.

   ---
   title: Rのパッケージを作成する 
   output: github_document 
   ---

github のmdファイルに目次をつける. Table of Contents

```{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" # 直前のコミットメッセージを変更する 

複数のコミットを 1 つにまとめるgit rebase -i

```{bash eval=F}

コミットログを確認 コミットのハッシュ値とメッセージを確認

git log --oneline

現在のブランチの先頭から 3 つのコミットを編集

git rebase -i HEAD~3

指定のコミット以降のコミットを編集

git rebase -i "ハッシュ値"

pickをfixupに置換する

:%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()


shkonishi/hello documentation built on Nov. 18, 2023, 6:37 p.m.