rix 入門

R言語には、`rix`という`default.nix`を生成できるpackageが存在します。この記事では、その`rix`の使い方を紹介したいと思います。

:::note warn
この記事は、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`を生成できます。

https://github.com/ropensci/rix

## `default.nix`を生成し、仮想開発環境のシェルが立ち上がるまでの流れ
ざっと、流れを図示すると以下のような感じになります。
![JapanR2024.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3052981/87f0126d-e979-cee8-9aa8-bddc35e4b516.png)

# 使い方
では、Nixおよび`rix`の使い方を説明します。

## 環境
OS: ubuntu24.04.1 LTS (VMware上で動かしている)

## `r-base`と`Nix`のセットアップ
以下のコマンドは、1行ずつ実行してください。
```shell
# 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行ずつ実行してください。
```shell
sudo apt install libcurl4-openssl-dev
sudo R -e 'install.packages("rix")'
```

## ソースコードの一例
以下は、ソースコードの一例です。以下のソースコードを実行すると、`~/Desktop/`配下に`default.nix`が生成されます。使い方が判明している引数のみ、コメントアウトで記載しておきます。

:::note note
確認はしていませんが、使用できるRのpackageはNixpkg化されたRのpackageのみが使用できるはずです。Nixpkgsの数は膨大なので、多くのR packageもNixpkg化されているはずです。なので、最新のバージョンを使用することが必須でない限り、そこまで問題にならないと思われます。
:::

:::note note
Nixpkgの検索は、以下のサイトから行えます。
https://search.nixos.org/packages
rPackages.[R言語のpackage名]という名前で、packageが存在するはずです。
例) rPackages.shiny
:::

```r
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`が生成されました。

```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`コマンドを実行すると、仮想開発環境のシェルが立ち上がります。
```shell
nix-shell
```

# サンプルのレポジトリ
サンプルのレポジトリを作成しましたので、適宜参照してください。

https://github.com/Myxogastria0808/rix-mytutorial

# 終わりに
ここまで記事を読んでいただきありがとうございます。
皆さんの快適なRライフの一助となれたらうれしいです。
では、また他の記事でお会いしましょう。
バイバイ (@^^)/~~~

# 参考サイト

https://docs.ropensci.org/rix/

 https://zenn.dev/asa1984/books/nix-introduction/viewer/04-re-what-is-nix