diff --git a/pkgs/applications/editors/rstudio/default.nix b/pkgs/applications/editors/rstudio/default.nix index f7ede1a8ea5..eab1228da1a 100644 --- a/pkgs/applications/editors/rstudio/default.nix +++ b/pkgs/applications/editors/rstudio/default.nix @@ -1,13 +1,5 @@ { stdenv, fetchurl, makeDesktopItem, cmake, boost163, zlib, openssl, -R, qt5, libuuid, hunspellDicts, unzip, ant, jdk, gnumake, makeWrapper, pandoc, -# If you have set up an R wrapper with other packages by following -# something like https://nixos.org/nixpkgs/manual/#r-packages, RStudio -# by default not be able to access any of those R packages. In order -# to do this, override the argument "R" here with your respective R -# wrapper, and set "useRPackages" to true. This will add the -# environment variable R_PROFILE_USER to the RStudio wrapper, pointing -# to an R script which will allow R to use these packages. -useRPackages ? false +R, qt5, libuuid, hunspellDicts, unzip, ant, jdk, gnumake, makeWrapper, pandoc }: let @@ -111,14 +103,8 @@ stdenv.mkDerivation rec { mimeType = "text/x-r-source;text/x-r;text/x-R;text/x-r-doc;text/x-r-sweave;text/x-r-markdown;text/x-r-html;text/x-r-presentation;application/x-r-data;application/x-r-project;text/x-r-history;text/x-r-profile;text/x-tex;text/x-markdown;text/html;text/css;text/javascript;text/x-chdr;text/x-csrc;text/x-c++hdr;text/x-c++src;"; }; - postInstall = let rProfile = - # RStudio seems to bypass the environment variables that the R - # wrapper already applies, and so this sets R_PROFILE_USER to - # again make those R packages accessible: - if useRPackages - then "--set R_PROFILE_USER ${R}/${R.passthru.fixLibsR}" else ""; - in '' - wrapProgram $out/bin/rstudio --suffix PATH : ${gnumake}/bin ${rProfile} + postInstall = '' + wrapProgram $out/bin/rstudio --suffix PATH : ${gnumake}/bin mkdir $out/share cp -r ${desktopItem}/share/applications $out/share mkdir $out/share/icons diff --git a/pkgs/development/r-modules/README.md b/pkgs/development/r-modules/README.md index fc046ed0627..477059cbb2c 100644 --- a/pkgs/development/r-modules/README.md +++ b/pkgs/development/r-modules/README.md @@ -55,28 +55,23 @@ available. ## RStudio -RStudio by default will not use the libraries installed like above. -You must override its R version with your custom R environment, and -set `useRPackages` to `true`, like below: +RStudio uses a standard set of packages and ignores any custom R +environments or installed packages you may have. To create a custom +environment, see `rstudioWrapper`, which functions similarly to +`rWrapper`: ```nix { packageOverrides = super: let self = super.pkgs; in { - rEnv = super.rWrapper.override { + rstudioEnv = super.rstudioWrapper.override { packages = with self.rPackages; [ - devtools + dplyr ggplot2 reshape2 - yaml - optparse ]; }; - rstudioEnv = super.rstudio.override { - R = rEnv; - useRPackages = true; - }; }; } ``` diff --git a/pkgs/development/r-modules/wrapper-rstudio.nix b/pkgs/development/r-modules/wrapper-rstudio.nix new file mode 100644 index 00000000000..dd9b0e9c538 --- /dev/null +++ b/pkgs/development/r-modules/wrapper-rstudio.nix @@ -0,0 +1,33 @@ +{ stdenv, R, rstudio, makeWrapper, recommendedPackages, packages }: + +stdenv.mkDerivation rec { + + name = rstudio.name + "-wrapper"; + + buildInputs = [makeWrapper R rstudio] ++ recommendedPackages ++ packages; + + unpackPhase = ":"; + + # rWrapper points R to a specific set of packages by using a wrapper + # (as in https://nixos.org/nixpkgs/manual/#r-packages) which sets + # R_LIBS_SITE. Ordinarily, it would be possible to make RStudio use + # this same set of packages by simply overriding its version of R + # with the wrapped one, however, RStudio internally overrides + # R_LIBS_SITE. The below works around this by turning R_LIBS_SITE + # into an R file (fixLibsR) which achieves the same effect, then + # uses R_PROFILE_USER to load this code at startup in RStudio. + fixLibsR = "fix_libs.R"; + installPhase = '' + mkdir $out + echo "# Autogenerated by wrapper-rstudio.nix from R_LIBS_SITE" > $out/${fixLibsR} + echo -n ".libPaths(c(.libPaths(), \"" >> $out/${fixLibsR} + echo -n $R_LIBS_SITE | sed -e 's/:/", "/g' >> $out/${fixLibsR} + echo -n "\"))" >> $out/${fixLibsR} + echo >> $out/${fixLibsR} + makeWrapper ${rstudio}/bin/rstudio $out/bin/rstudio --set R_PROFILE_USER $out/${fixLibsR} + ''; + + meta = { + platforms = stdenv.lib.platforms.unix; + }; +} diff --git a/pkgs/development/r-modules/wrapper.nix b/pkgs/development/r-modules/wrapper.nix index 25c76506027..3b9a9b18450 100644 --- a/pkgs/development/r-modules/wrapper.nix +++ b/pkgs/development/r-modules/wrapper.nix @@ -1,19 +1,12 @@ { stdenv, R, makeWrapper, recommendedPackages, packages }: -stdenv.mkDerivation rec { +stdenv.mkDerivation { name = R.name + "-wrapper"; buildInputs = [makeWrapper R] ++ recommendedPackages ++ packages; unpackPhase = ":"; - # This filename is used in 'installPhase', but needs to be - # referenced elsewhere. This will be relative to this package's - # path. - passthru = { - fixLibsR = "fix_libs.R"; - }; - installPhase = '' mkdir -p $out/bin cd ${R}/bin @@ -21,17 +14,6 @@ stdenv.mkDerivation rec { makeWrapper ${R}/bin/$exe $out/bin/$exe \ --prefix "R_LIBS_SITE" ":" "$R_LIBS_SITE" done - # RStudio (and perhaps other packages) overrides the R_LIBS_SITE - # which the wrapper above applies, and as a result packages - # installed in the wrapper (as in the method described in - # https://nixos.org/nixpkgs/manual/#r-packages) aren't visible. - # The below turns R_LIBS_SITE into some R startup code which can - # correct this. - echo "# Autogenerated by wrapper.nix from R_LIBS_SITE" > $out/${passthru.fixLibsR} - echo -n ".libPaths(c(.libPaths(), \"" >> $out/${passthru.fixLibsR} - echo -n $R_LIBS_SITE | sed -e 's/:/", "/g' >> $out/${passthru.fixLibsR} - echo -n "\"))" >> $out/${passthru.fixLibsR} - echo >> $out/${passthru.fixLibsR} ''; meta = { diff --git a/pkgs/top-level/all-packages.nix b/pkgs/top-level/all-packages.nix index d7ba2652fe1..8692977cec2 100644 --- a/pkgs/top-level/all-packages.nix +++ b/pkgs/top-level/all-packages.nix @@ -10610,6 +10610,15 @@ with pkgs; packages = []; }; + rstudioWrapper = callPackage ../development/r-modules/wrapper-rstudio.nix { + recommendedPackages = with rPackages; [ + boot class cluster codetools foreign KernSmooth lattice MASS + Matrix mgcv nlme nnet rpart spatial survival + ]; + # Override this attribute to register additional libraries. + packages = []; + }; + rPackages = callPackage ../development/r-modules { overrides = (config.rPackageOverrides or (p: {})) pkgs; };