README.md

Rのパッケージを作成する

S.Konishi 2023-11-15

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パッケージを作成する場合

リモートリポジトリをローカルに複製する場合

RStudioからFile -> New Project -> Version Control -> Gitを選んで, Repository URL:を入れてCreate Projectでローカルリポジトリーにクローンできる. 例えばローカルリポジトリを~/Rpkg/hello以下に作りたい場合、以下のように記入する.

パッケージの中身を確認

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

ローカルリポジトリとリモートリポジトリを同期

# # ターミナルから以下を実行
# 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からダウンロード可能になっているので、インストールしてみる. リモートリポジトリにローカルリポジトリの変更が反映されているか確認する.

# GitHubからソースパッケージをダウンロード->ビルド->インストールする  
devtools::install_github("shkonishi/hello", quiet = T) 

# 試しに関数を実行してみる. 
library(hello)
hello(n = 3)
## [1] "Hello, world!" "Hello, world!" "Hello, world!"

ローカルリポジトリの編集

.gitignore

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

.Rbuildignore

## ^.*\.Rproj$
## ^\.Rproj\.user$
## ^\.DS_Store$
## ^README\.Rmd$
## ^README\.md$

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')))
##               license
## stats Part of R 4.3.2

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

  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

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"

git log --oneline #コミットログを確認 
git commit --amend -m "add binary data" # 直前のコミットメッセージを変更する 

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

#コミットログを確認 コミットのハッシュ値とメッセージを確認 
git log --oneline 

# 現在のブランチの先頭から 3 つのコミットを編集 
git rebase -i HEAD~3 

# 指定のコミット以降のコミットを編集 
git rebase -i "ハッシュ値" 

# pickをfixupに置換する 
:%s/pick/fixup/gc
:wq

# 一連の処理を取り消す 
git rebase --abort

リポジトリの削除

アクセストークンの期限切れ

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


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