Re: Launching R executables within custom shell environments

Kyle Andrews via ESS-help <[email protected]>
Newsgroups gmane.emacs.ess.general
Message-ID <CAG3md+tPqJaLKP2+ckrWz4mxvSog=aw1fn3QzmmwZDwbQCg2oQ@mail.gmail.com>
Thanks for sharing Dominic! I didn't know about envrc as an emacs frontend
to direnv. That looks quite interesting. I really like the idea of
buffer-local environments.

On Tue, Apr 5, 2022, 10:48 Dominic Steinitz <[email protected]> wrote:

> For reasons I don’t understand, the ESS mailing list is ignoring my
> responses - maybe someone can forward this on to the list?
>
> Dominic Steinitz
> [email protected]
> http://idontgetoutmuch.org
> Twitter: @idontgetoutmuch
>
> Dear ESS users,
>
> I'm interested if there is anyone on this mailing list who uses Emacs
> Speaks Statistics from within Guix or Nix, both of which bake
> reproducibility directly into their operating systems) or from anyone
> who might otherwise be familiar with some elisp code which uses the ESS
> remote session functionality to start an R interpreter from a different
> environment on the local system (such that it behaves great without
> having to worry about conflicting environment variables)?
>
> That was a mouthful, but I hope that was enough to peak someones
> interest. I'm just looking to see if this problem has already been
> well handled.
>
> Thanks,
> Kyle
>
>
> Hi Kyle,
>
> I use `direnv` and https://github.com/purcell/envrc. I can’t remember the
> exact sequence but I think I did `nix-env -i direnv` and then set up a
> `.envrc` with the line `use nix` in it. You might have to do `M-x
> envrc-allow`. Then your nix environment is available in emacs (as well as
> the same one being in a shell). Then I just `M-x R`.
>
> FWIW I have
>
> ```
>
>  '(package-selected-packages
>    '(forge poly-markdown polymode poly-R envrc direnv json-mode stan-mode
> git-timemachine ein markdown-mode exec-path-from-shell nix-mode ess
> matlab-mode haskell-mode helm magit use-package))
>
> ```
>
> And my current `shell.nix` is
>
> ```
>
> let
>
> rOverlay = rself: rsuper: {
>   rPackages = rsuper.rPackages.override {
>     overrides = {
>       smcsamplers = (rself.rPackages.buildRPackage {
>         name = "smcsamplers";
>         src = rself.fetchFromGitHub {
>           owner = "pierrejacob";
>           repo = "smcsamplers";
>           rev = "097192f7d5df520d9b026d442dfec493a3051374";
>           sha256 = "00facn1ylcbai4sbcidpp991899csz2ppmmkv0khvqxfncddr0f2";
>         };
>         propagatedBuildInputs = [ rsuper.rPackages.coda
> rsuper.rPackages.MASS rsuper.rPackages.mvtnorm rsuper.rPackages.loo
> rsuper.rPackages.shape rsuper.rPackages.rstan rsuper.rPackages.tidyverse
> rsuper.rPackages.doParallel rsuper.rPackages.igraph rsuper.rPackages.ggraph
> rsuper.rPackages.doRNG rsuper.rPackages.reshape2 ];
>       });
>
>       cmdstanr = (rself.rPackages.buildRPackage {
>         name = "cmdstanr";
>         src = rself.fetchFromGitHub {
>           owner = "stan-dev";
>           repo = "cmdstanr";
>           rev = "2e24ec873c5513b41fba90ee59e0dffcd27a479c";
>           sha256 =
> "sha256:0nrqlidsrykszasdypsldsbhv4dcbrj9awyyzq7rb6kc5y8fnhvi";
>         };
>         propagatedBuildInputs = [ rsuper.rPackages.coda
> rsuper.rPackages.MASS rsuper.rPackages.mvtnorm rsuper.rPackages.loo
> rsuper.rPackages.shape rsuper.rPackages.rstan rsuper.rPackages.tidyverse
> rsuper.rPackages.doParallel rsuper.rPackages.igraph rsuper.rPackages.ggraph
> rsuper.rPackages.doRNG rsuper.rPackages.reshape2
> rsuper.rPackages.data_table rsuper.rPackages.posterior ];
>       });
>
>     };
>   };
> };
>
> myHaskellPackageOverlay = self: super: {
>   myHaskellPackages = super.haskell.packages.ghc921.override {
>     overrides = hself: hsuper: rec {
>
>       inline-r = super.haskell.lib.dontCheck (
>         hself.callCabal2nixWithOptions "inline-r" (builtins.fetchGit {
>           url = "https://github.com/tweag/HaskellR";
>           rev = "c3ba1023480e26ade420896bcb629ceaad59f308";
>         }) "--subpath inline-r" { });
>
>       singletons = self.haskell.lib.addBuildDepends(
>         hself.callHackageDirect {
>           pkg = "singletons";
>           ver = "3.0.1";
>           sha256 = "sha256-ixHWZae6AxjRUldMgpYolXBGsOUT5ZVIw9HZkxrhHQ0=";
>         } { }) [ ];
>
>     };
>   };
> };
>
> in
>
> { nixpkgs ? import "/Users/dom/nixpkgs" {
>   config.allowBroken = true;
>   overlays = [ myHaskellPackageOverlay rOverlay ];
>   # system = "x86_64-darwin";
> }
> }:
>
> let
>   R-with-my-packages = nixpkgs.rWrapper.override{
>     packages = with nixpkgs.rPackages; [
>       ggplot2
>     ]; };
>
>   pkgs = nixpkgs;
>
>   haskellDeps = ps: with ps; [
>     base
>     cassava
>     conduit
>     Frames
>     streamly
>     (pkgs.haskell.lib.dontCheck Frames-streamly)
>     hasql
>     http-client
>     http-client-tls
>     http-conduit
>     postgresql-binary
>     (pkgs.haskell.lib.dontCheck inline-r)
>     resourcet
>     time
>     vinyl
>     xlsx
>     zip
>   ];
>
> in
>
> pkgs.stdenv.mkDerivation {
>   name = "xxx";
>
>   buildInputs = with pkgs.rPackages; [
>     pkgs.libintlOrEmpty
>     R-with-my-packages
>     (pkgs.myHaskellPackages.ghcWithPackages haskellDeps)
>     pkgs.darwin.apple_sdk.frameworks.Cocoa
>   ];
>   shellHook = ''
>     R_LIBS_USER=$(Rscript -e ".libPaths()" | cut -c 6- | sed 's/[ \t]*$//'
> | sed 's/"//g' | sed -z 's/\n/:/g;s/:'''$/\n/' | sed 's/ //g')
>     export R_LIBS_USER
>     '';
> }
>
> ```
>
> I am guessing you don’t need the Haskell stuff. `The shellHook` is there
> so that Haskell picks up the “right” set of R libraries. I am sure it can
> be improved; I am barely an intermediate nix user. Oh I nearly forgot -
> because I was trying to fix something, I am pointing at my local copy
> of Nixpkgs. Clearly it should be pinned to something more permanent and
> reproducible.
>
> Dominic Steinitz
> [email protected]
> http://idontgetoutmuch.org
> Twitter: @idontgetoutmuch
>
>
>

	[[alternative HTML version deleted]]

______________________________________________
[email protected] mailing list
https://stat.ethz.ch/mailman/listinfo/ess-help
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.