A short post on my current set-up for R with nixpkgs and emacs to auto-compile my system configuration.

## Background

This is my third post on working with nixpkgs and R.

• Part I covered ways of working effectively with R and nixpkgs
• Part II dealt with composing dependent devtools packages in a per-package environment, with a focus on rethinking and tidybayes.rethinking

This final part is about automating the system-wide configuration using emacs. Specifically doom-emacs. Naturally, this is the most optimal way to work with nix packages as well.

### System Configuration

After experimenting with a per-project layout, I decided to use the full system configuration instead of the per-project layout. So I simply set:

 1# $HOME/.config/nixpkgs/config.nix 2{ 3 packageOverrides = super: 4 let 5 self = super.pkgs; 6 rethinking = with self.rPackages; 7 buildRPackage { 8 name = "rethinking"; 9 src = self.fetchFromGitHub { 10 owner = "rmcelreath"; 11 repo = "rethinking"; 12 rev = "d0978c7f8b6329b94efa2014658d750ae12b1fa2"; 13 sha256 = "1qip6x3f6j9lmcmck6sjrj50a5azqfl6rfhp4fdj7ddabpb8n0z0"; 14 }; 15 propagatedBuildInputs = [ coda MASS mvtnorm loo shape rstan dagitty ]; 16 }; 17 tidybayes_rethinking = with self.rPackages; 18 buildRPackage { 19 name = "tidybayes.rethinking"; 20 src = self.fetchFromGitHub { 21 owner = "mjskay"; 22 repo = "tidybayes.rethinking"; 23 rev = "df903c88f4f4320795a47c616eef24a690b433a4"; 24 sha256 = "1jl3189zdddmwm07z1mk58hcahirqrwx211ms0i1rzbx5y4zak0c"; 25 }; 26 propagatedBuildInputs = 27 [ dplyr tibble rlang MASS tidybayes rethinking rstan ]; 28 }; 29 in { 30 rEnv = super.rWrapper.override { 31 packages = with self.rPackages; [ 32 tidyverse 33 devtools 34 modelr 35 purrr 36 forcats 37 #################### 38 # Machine Learning # 39 #################### 40 # MLR3 41 mlr3 42 mlr3viz 43 mlr3learners 44 mlr3pipelines 45 # Plotting tools 46 ggplot2 47 cowplot 48 ggrepel 49 RColorBrewer 50 # Stan Stuff 51 rstan 52 tidybayes 53 # Text Utilities 54 orgutils 55 latex2exp 56 kableExtra 57 knitr 58 data_table 59 printr 60 # Devtools Stuff 61 rethinking 62 tidybayes_rethinking 63 ]; 64 }; 65 }; 66}  If any of these look strange, refer to the earlier posts. ## Automation Pains direnv, lorri and niv (the heroes of Part II) are not really useful for working with the system-wide configuration, but an elegant solution still exists, which leverages firestarter and after-save-hooks in emacs. ### Firestarter Firestarter is my favorite method of working with shell commands after saving things. My setup is simply: 1; packages.el 2(package! firestarter)  This is coupled with a simple configuration. 1; config.el 2(use-package! firestarter 3 :ensure t 4 :init 5 (firestarter-mode) 6 :config 7 (setq firestarter-default-type t) 8)  The default type corresponds to demanding the shell outupt for the commands. ### Nix-R Stuff To finalize this setup, we will need to modify our system configuration slightly. For brevity, we simply note the following local variables. 1#$HOME/.config/nixpkgs/config.nix
2# Local Variables:
3# firestarter: "nix-env -f '<nixpkgs>' -iA rEnv"
4# firestarter-default-type: (quote failure)
5# End:


The firestarter-default-type used here is to ensure that errors are displayed in a buffer.

To check what is being installed (if anything) simply run:

1nix-env -f "<nixpkgs>" -iA rEnv --dry-run


## Conclusion

This is my current setup. It works out better than most of my other attempts and seems to be an optimal approach. The packages are versioned, everything is automated, and I can reproduce changes across all my machines. Will stick with this.