[1] 4
初級から中級へのステップアップ
初級者を名乗るのは簡単なことですが,どこから中級者を名乗ればいいのかは難しい。
個人的には,↓ぐらいが中級者のラインではないかと。ちなみに,いずれも「案ずるより産むが易し」で,やってみたら意外と簡単なステップなんです。
今日は「関数とパッケージの作り方」をお話しするので,今日の話を聞き終わったら皆さんも中級者?
関数を使うのは簡単ですね。たとえば平方根を求めたいときに,
のように使うわけです。このとき,
sqrtは関数名4という結果は戻り値(もどりち,value)といいます。
関数を作る関数,functionをつかって次のように関数を作ることができます。
functionでつくるオブジェクトを代入します。後ろの()`に,その関数がとる引数名を書きます。{}に関数の計算・操作を書きます。複数行可。return関数に戻り値にするものを渡しますこれで関数add2ができました。使い方は他の関数と同じです。
この関数は与えられた数字に2を足して返すだけ挙動ですが,うまく動いてますね!
さっきの関数は引数がひとつだけでした。複数指定するときは,()のなかに並べて書きます。
関数を作る時に,引数に値を渡しておくと,それがデフォルトの値になります。
関数の中で作った・使ったオブジェクトは,関数の外から参照できません。
これに続けて,関数の中でつかっていた一時オブジェクトtmpを参照してみましょう。
Error:
! オブジェクト 'tmp' がありません
実行が停止されました
Oh…! 😱
関数の中で使った変数は関数の外で使えないというのは,不便に思えますが,実は親切設計。
関数の中で閉じている・まとまっていることで,オブジェクトがあちこちで上書きされたりすることがなくなります
変数がどこまで効いているかという概念を「スコープ」と言いますが,これができるまでのプログラミング言語(FortranとかBASICとか)は,長いコードの中で変数名がごっちゃになることがありました。
歴史的経緯で,「どこからでも変数名が見える」状態から,「全体で利用できる変数(グローバル変数)と,関数の中だけて使える変数(ローカル変数)にわける」状態へ,そして「もう全部関数の中に閉じ込めちゃえよ」となってきています。

しかし,Rは関数の中で見つからない変数があれば,環境変数を再利用します!ちょっとコワイ。
注目ポイントは,次の3点です。
pre_tmpはこの関数myFuncの引数ではない。pre_tmpはこの関数の中で違う数字を割り当てられている。tmpだけである。Rはこのように「再利用癖」があるので,注意しましょう。
関数を作るときは, 関数の中で使う変数は全て引数に指定することを心がけた方が良いかも。
Rの関数が返すオブジェクトは一つだけ。もし複数の値を返したいのなら,listでまとめよう。
使い方の例;
こんな感じで関数が作れます!色々作ってみよう。
varはあるけど標本分散を計算する関数はないよ。作ってみよう!そしてたくさん関数を書いたら・・・・
Rではデフォルトで持っているパッケージでも一通りの計算ができるが,より便利に・より専門的に使うためにはパッケージの導入は必須。
(心理統計で)よく使うパッケージとしては次のようなものが
これらはlibrary関数で呼び出すことができる。欲しいパッケージはインターネットからとってくることができる。
.tar.gz形式で圧縮されています。
devtoolsパッケージを使ってダウンロードすることができる。https://kosugitti.github.io/Exametrika/
Readme.mdが自動的にサイト化される 
Githubのレポジトリはこんな感じ 

パッケージには関数,データセット,ヘルプファイルが含まれますが・・・
library(MyPackage)devtoolsはスケルトン,チェック,ビルドなどを手助けしてくれるusethisは初期設定などをカンタンにしてくれるroxygen2はヘルプファイルを自動的に作ってくれる

まずは新しいプロジェクトから




サンプルコードhello.Rというのが表示されていると思います。 Filesタブを見ると,他にもNAMESPACE,DESCRIPTION,manフォルダ,Rフォルダがあるのがわかります。 (.Rprojはプロジェクトファイル,.Rbuildignoreはプロジェクト関係なので一旦無視)
R,man,data,inst,testsからなる
RフォルダにRのコードを書きますmanフォルダにヘルプファイルを入れますが,roxygen2 が自動生成するので気にする必要なし!dataフォルダにパッケージと共に共有するデータを入れます。instはその他のメタデータ,testsは検証テストコードなどを入れます。developフォルダをつくって下書きのコードを入れておきます。BuildタブのConfigure Build Tools…をクリックし,自動生成(ラクチン!)してくれるための設定をしておこう。


NAMESPACEはパッケージが使う関数名を書くところなので,自分で作らないのが基本。 でもRoxygenで自動生成するためには,すでに存在しているNAMESPACEがRoxygenで作られたものでなければならないので,最初のNAMESPACEは削除しておこう。
あるいは, usethis::use_namespace()で上書きしても良い。
開いた時に「このドキュメントは読むの専門だぞ(書き込んじゃダメだぞ)」,roxygen2によって作られました,と書いてあればOK。以後自動的に書き加えられていきます。
次はDESCRIPTIONの編集。これは手書きで。
Title; パッケージ名Author; 作者名Maintainer;保全・管理する人。Description; 説明書※英語です!chatGPT先生に翻訳してもらおう!
パッケージを公開する時の権利関係を明記しておきましょう。 usethisパッケージにはいろいろなライセンスが用意されており,名前だけでうまくやってくれるようになっています。
use_mit_license;短くて理解しやすいライセンス。このライセンスでは,誰でもコードを変更し配布することを許可しているが,下のライセンスと著作権表示は保持されるというもの。
use_gpl3_license;GPLは「ソフトウェアを使う自由」「変更する自由」「ソフトウェアを共有する自由」「変更を共有する自由」をうたうフリーソフトウェアの精神。R自体がGPLに基づいています。
use_apl2_licence;アパッチ(Apache)ライセンスは,Apacheソフトウェア財団が公開し ているもので,商用利用や改変ができるライセンス。

LICENSE.mdファイルが自動的に追加される。
Roxygenで自動生成してくれるのは,ヘルプだけでなくREADME.Rmdも。
READMEとは,「まずこれを読んでね」という最初の説明書ファイル。Rmd書式で準備すると,Githubで公開する時の表紙になる。便利!
これが自動的に用意されます! 
あとは関数をバリバリ書いていくだけ。ここでヘルプを自動的に作ってもらうために,関数の前にRoxygenコメントを用意しよう。
Roxygenコメントは#'から始めることでただのコメントアウトじゃないよ,ということを表現。続く@XXX でヘルプのどこに何を表示させるかを書きます。
#' @title 関数名
#' @author 関数の作者名。必要なら。
#' @description 関数の説明
#' @details さらに詳しい説明
#' @note descriptionに書くほどではないことを書くならこちら
#' @importFrom 関数の中で他のパッケージから引用した関数を使うときは,全てここに書く
#' @param この関数が取る引数を書く
#' @return この関数が返す値を書く
#' @export この関数をユーザが使ってほしい時は,必ずこのコマンドが必要
#' @reference 参考資料や引用文献を\url{}などで記載
#' @examples 関数の使用例を書く
#' @seealso 他のドキュメントやウェブサイトへのリンクをかく。
#' @seealso[function()]など@title,@descriptionはまあ書きましょう。@importFromは忘れがち!でも忘れてたらコンパイル時にエラーで教えてくれるのでダイジョブ@exportを忘れると,コンパイルしても「ユーザが使えない関数」になっちゃう。そんなのいるの?と思うかもしれないけど,内部だけの処理で直接ユーザに触って欲しくない関数を書くこともあるので・・・物は試し。やってみましょう。R/hello.R, man/hello.Rdを消して,関数を書きます!




エラーや警告はつきもの!おそれないでね。むしろこれをひとつずつ潰していくのが快感・・・
先ほどの関数,引数xをとっていたのに,@paramの設定がなかったことが問題で警告が出ています。
@paramを書きました。@exportもね!

save関数をつかって.rda形式にし,dataフォルダに入れる。Roxygenコメントで@importFromを忘れずに。Depends: として外部からとってくるパッケージを書こう(手動)DESCRIPTIONは手動で修正していく。Versionはお気持ち次第。
usethis::use_news_md()をつかうとNEWS.mdファイルを作ることができる。要するにバージョンが上がった時に何が変わったか,を記録するところ。testthatをつかうと検証用コードを書くことができて,「新しい環境にこのパッケージを入れたらちゃんと動くかな?」を確認できる。devtools::build()で.tar.gzファイルができるので,これでファイルとして共有できる。インストールはinstall.packages(ファイル名, repos = NULL, type = "source")で。RStudioのGUI経由のほうが楽かも。hexStickerパッケージを使うと,六角形の例のかっこいいシールが作れたりします!
Yamaguchi.R Advanced Session