R のスクリプトをパッケージっぽく読み込むパッケージを作ってみた
R で簡易的なスクリプトを書く時の不満は名前空間がないことです。
source 関数でロードすると全ての変数がグローバル空間に定義されます1。変数名をドットで始めれば利用者からは見えにくくなりますが、グローバル空間を汚染するのは精神衛生上よろしくないです。
かといって、ちょっとしたスクリプトをパッケージの形式で作成してインストールするのは物凄く手間です。
というわけでそれを解消するパッケージを作ってみました。
https://github.com/abicky/packageR
これを使うことで、今まで source でロードしていたスクリプトの内容を、指定した名前空間にロードできるようになります。
インストール
まず namespace パッケージをインストールします。
$ Rscript -e 'install.packages("namespace")'
次にリポジトリをクローンしてインストールします。
$ git clone git@github.com:abicky/packageR.git
$ R CMD INSTALL packageR
使い方
スクリプトを作成する際、特定の変数を ::
でアクセスできるようにするには export 関数でエクスポートします。エクスポートされていない変数は ::
ではアクセスできないので、:::
などを使うことになります。
> library(packageR)
> files <- system.file("examples", c("public.R", "private.R"), package = "packageR")
> file.show(files)
f <- function() {
return("f")
}
g <- function() {
return("g")
}
v <- "public variable"
export(f, g, v)
.f <- function() {
return(".f")
}
.g <- function() {
return(".g")
}
.v <- "private variable"
> import(files, "foo")
> foo::f()
[1] "f"
> # エクスポートされてなければ `::` でアクセスできない
> foo::.f()
Error: '.f' is not an exported object from 'namespace:foo'
> foo:::.f()
[1] ".f"
個人的には前々から切望していた仕組みなんですが、どうですかね?
好評だったら CRAN に申請してみます。
-
sys.source を使うと解決できますが一般的ではないでしょう ↩