R言語には、rix
というdefault.nix
を生成できるpackageが存在します。この記事では、そのrix
の使い方を紹介したいと思います。
この記事は、R言語とNixが好きなしがない大学生が書いたものです。そのため、内容に誤りがあったり、表現が正しくないことがあるかもしれません。ご了承ください。
Nixとは
純粋関数型のパッケージマネージャのことです。また、パッケージマネージャは、パッケージの管理を容易にするツールです。
Nixの特徴をいくつか挙げるならば、再現可能なビルドができること、Nix言語で宣言的にパッケージ定義を記述できること、パッケージをアップグレードしても壊れない信頼性があることだと思います。この記事に最も強く結びついてくるNixの特徴は、再現性です。環境の再現はDockerがあると思いますが、この記事で紹介するNixの使い方は環境を再現する手段の一つとして考えていただけたら良いと思います。
rixとは
Nixにはnix-shell
というコマンドがあり、nix-shell
を実行すると、Nix言語の記述を元に構築された仮想開発環境のシェルが立ち上がります。そして、nix-shell
はdefault.nix
またはshell.nix
というファイルに書かれた記述を元に、仮想開発環境を構築します。nix-shell
は非常に便利ですが、Nix言語を書く必要があります。そこで、rix
の出番です。rix
を使用すると、R言語で書いたソースコードを元にdefault.nix
を生成できます。
default.nix
を生成し、仮想開発環境のシェルが立ち上がるまでの流れ
使い方
では、Nixおよびrix
の使い方を説明します。
環境
OS: ubuntu24.04.1 LTS (VMware上で動かしている)
r-base
とNix
のセットアップ
以下のコマンドは、1行ずつ実行してください。
# install r-base
sudo apt install r-base
# setup Nix
sudo apt install curl
sh <(curl -L https://nixos.org/nix/install) --daemon
sudo apt install nix-bin
rix
のinstall
以下のコマンドは、1行ずつ実行してください。
sudo apt install libcurl4-openssl-dev
sudo R -e 'install.packages("rix")'
ソースコードの一例
以下は、ソースコードの一例です。以下のソースコードを実行すると、~/Desktop/
配下にdefault.nix
が生成されます。使い方が判明している引数のみ、コメントアウトで記載しておきます。
確認はしていませんが、使用できるRのpackageはNixpkg化されたRのpackageのみが使用できるはずです。Nixpkgsの数は膨大なので、多くのR packageもNixpkg化されているはずです。なので、最新のバージョンを使用することが必須でない限り、そこまで問題にならないと思われます。
Nixpkgの検索は、以下のサイトから行えます。
https://search.nixos.org/packages
rPackages.[R言語のpackage名]という名前で、packageが存在するはずです。
例) rPackages.shiny
library(rix)
rix(
r_ver = "latest",
#必要なpackageを記載する
#例としてggplot2を追加した場合を記載しています
r_pkgs = c("ggplot2"),
system_pkgs = NULL,
git_pkgs = NULL,
ide = "code",
shell_hook = NULL,
#default.nixが生成されるディレクトリを指定
project_path = "~/Desktop/",
#TRUEのとき: すでに指定したディレクトリ配下にdefault.nixがあったら上書きする
#FALSEのとき: すでに指定したディレクトリ配下にdefault.nixがあったら上書きしない
overwrite = TRUE,
#TRUEにするとdefault.nix生成時にターミナルに詳細なログを出す
print = TRUE
)
上記のソースコードを実行すると、以下のdefault.nix
が生成されました。
# This file was generated by the {rix} R package v0.12.4 on 2024-12-01
# with following call:
# >rix(r_ver = "4703b8d2c708e13a8cab03d865f90973536dcdf5",
# > r_pkgs = c("ggplot2"),
# > system_pkgs = NULL,
# > git_pkgs = NULL,
# > ide = "code",
# > project_path = "~/Desktop/",
# > overwrite = TRUE,
# > print = TRUE,
# > shell_hook = NULL)
# It uses nixpkgs' revision 4703b8d2c708e13a8cab03d865f90973536dcdf5 for reproducibility purposes
# which will install R version latest.
# Report any issues to https://github.com/ropensci/rix
let
pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/4703b8d2c708e13a8cab03d865f90973536dcdf5.tar.gz") {};
rpkgs = builtins.attrValues {
inherit (pkgs.rPackages)
ggplot2
languageserver;
};
system_packages = builtins.attrValues {
inherit (pkgs)
glibcLocales
nix
R;
};
in
pkgs.mkShell {
LOCALE_ARCHIVE = if pkgs.system == "x86_64-linux" then "${pkgs.glibcLocales}/lib/locale/locale-archive" else "";
LANG = "en_US.UTF-8";
LC_ALL = "en_US.UTF-8";
LC_TIME = "en_US.UTF-8";
LC_MONETARY = "en_US.UTF-8";
LC_PAPER = "en_US.UTF-8";
LC_MEASUREMENT = "en_US.UTF-8";
buildInputs = [ rpkgs system_packages ];
}
nix-shell
コマンドの実行
default.nix
があるディレクトリでnix-shell
コマンドを実行すると、仮想開発環境のシェルが立ち上がります。
nix-shell
サンプルのレポジトリ
サンプルのレポジトリを作成しましたので、適宜参照してください。
終わりに
ここまで記事を読んでいただきありがとうございます。
皆さんの快適なRライフの一助となれたらうれしいです。
では、また他の記事でお会いしましょう。
バイバイ (@^^)/~~~
参考サイト