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 に申請してみます。

  1. sys.source を使うと解決できますが一般的ではないでしょう