Difference between revisions of "R"

From NixOS Wiki
Jump to: navigation, search
(Officer package does not work unless installed with install.packages())
m (rollback unauthorized mass edits)
Tag: Rollback
 
(6 intermediate revisions by 5 users not shown)
Line 59: Line 59:
  
 
== R with Lorri ==
 
== R with Lorri ==
An example of a '''shell.nix''' for usage with [https://github.com/target/lorri lorri] is shown below:
+
An example of a '''shell.nix''' for usage with [https://github.com/nix-community/lorri lorri] is shown below:
  
 
<syntaxhighlight lang = "nix">
 
<syntaxhighlight lang = "nix">
Line 75: Line 75:
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 +
== R with Flakes and nix-direnv==
 +
 +
R and accompanying R-packages can be installed using a [https://nixos.wiki/wiki/Flakes Flake] and then managed/activated with [https://github.com/nix-community/nix-direnv nix-direnv] to create a reproducible development environment. After the initial setup of nix-direnv (instructions provided on the GitHub README), there is a [https://github.com/nix-community/nix-direnv/blob/master/templates/flake/flake.nix flake template] provided by the nix-direnv maintainers to get started. Run <code>nix flake new -t github:nix-community/nix-direnv .</code> to initialize the flake template in your current directory. This will create a `flake.nix` file that can be edited to setup the R-environment:
 +
 +
<syntaxhighlight lang = "nix" >
 +
{
 +
  description = "A basic flake with a shell";
 +
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
 +
  inputs.flake-utils.url = "github:numtide/flake-utils";
 +
 +
  outputs = { self, nixpkgs, flake-utils }:
 +
    flake-utils.lib.eachDefaultSystem (system: let
 +
      pkgs = nixpkgs.legacyPackages.${system};
 +
    in {
 +
      devShells.default = pkgs.mkShell {
 +
        nativeBuildInputs = [ pkgs.bashInteractive ];
 +
        buildInputs = with pkgs; [ R rPackages.pagedown chromium pandoc ];
 +
      };
 +
    });
 +
}
 +
</syntaxhighlight>
 +
 +
Saving the file and then running <code>direnv allow</code> in the terminal of the project directory will execute the `flake.lock` and build the shell. This will install the current version of R and the R-package {pagedown} that is in <nixpkgs>. Note additional system dependencies may need installed for certain packages to work such as pandoc for document conversion with {rmarkdown}. Here, chromium is installed in the `buildInputs` so the <code>chrome_print</code> function can be used from {pagedown}. 
 +
 +
[https://github.com/wbolster/emacs-direnv Emacs has support for direnv] which can be setup to use R with ESS. Direnv functionality can also be set in Doom Emacs under :tools in the `init.el` file in `.doom.d` folder.
 +
 +
==Install an R-package from GitHub==
 +
 +
The R-packages available in <nixpkgs> are generated from a recent snapshot of CRAN. You may find certain packages a version behind or want to install a package not on CRAN/Bioconducter. R-packages can be installed from GitHub using `buildRPackage` and `fetchFromGitHub`. An example of installing {rmarkdown} from GitHub using a Flake:
 +
 +
<syntaxhighlight lang = "nix" >
 +
{
 +
  description = "A basic flake with a shell";
 +
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
 +
  inputs.flake-utils.url = "github:numtide/flake-utils";
 +
 +
  outputs = { self, nixpkgs, flake-utils }:
 +
    flake-utils.lib.eachDefaultSystem (system: let
 +
      pkgs = nixpkgs.legacyPackages.${system};
 +
      rmark = pkgs.rPackages.buildRPackage {
 +
        name = "rmarkdown";
 +
        src = pkgs.fetchFromGitHub{
 +
          owner = "rstudio";
 +
          repo = "rmarkdown";
 +
          rev = "b87ca50c8c4d5a5876333b598aed4eb84de925a3";
 +
          sha256 = "12mhmmibizbxgmsns80c8h97rr7rclv9hz98zpgsl26hw3s4l0vm";
 +
        };
 +
  propagatedBuildInputs = with pkgs.rPackages; [bslib evaluate jsonlite knitr stringr tinytex yaml xfun];
 +
      };
 +
    in {
 +
      devShells.default = pkgs.mkShell {
 +
        nativeBuildInputs = [ pkgs.bashInteractive ];
 +
        buildInputs = with pkgs; [ R rmark pandoc ];
 +
      };
 +
    });
 +
}
 +
 +
</syntaxhighlight>
 +
 +
You will need to obtain the `rev` and `sha256` for the package on github [https://search.nixos.org/packages?channel=22.05&show=nix-prefetch-git&from=0&size=50&sort=relevance&type=packages&query=nix-prefetch-git which can be found by using the `nix-prefetch-git` command line tool.] For the above example, running <code>nix-prefetch-git https://github.com/rstudio/rmarkdown</code> from a terminal will generate the information. You may need to manually specify other R-package/system dependencies for the specific package in the `propagatedBuildInputs`. This information can be found in the `DESCRIPTION` file of the R-package source directory.
 +
 
== A note on knitr ==
 
== A note on knitr ==
  
Line 88: Line 149:
 
== External Documentation ==
 
== External Documentation ==
  
* [https://nixos.org/nixpkgs/manual/#r-packages R user guide in nixpkgs manual]
+
* [https://nixos.org/manual/nixpkgs/stable/#r R user guide in nixpkgs manual]
  
 
== Officer package ==
 
== Officer package ==
Line 105: Line 166:
 
However officer does work if installed using the conventional install.packages() which can be enabled as discussed in
 
However officer does work if installed using the conventional install.packages() which can be enabled as discussed in
 
https://churchman.nl/tag/r/
 
https://churchman.nl/tag/r/
 +
 +
[[Category:Languages]]

Latest revision as of 10:56, 6 April 2024

R comes with a very large number of packages, many of which available through nixpkgs. In particular, any package available through CRAN.

Similarly to Python, your packages must be declared when installing R. Commands such as install.packages("ggplot2") will not work.

To install R with a collection of packages, a new nix package must be defined, for instance

with pkgs;
let
  R-with-my-packages = rWrapper.override{ packages = with rPackages; [ ggplot2 dplyr xts ]; };
in ...

and then you can put R-with-my-packages into your environment.systemPackages for a system-wide installation, for instance.

If you with to use `nix-shell` to generate an on-the-fly environment with some R packages, the command is similar:

nix-shell --packages 'rWrapper.override{packages = [ rPackages.ggplot2 ];}'

RStudio

RStudio uses a standard set of packages and ignores any custom R environments, like the one set up above. To install it you can use rstudioWrapper just as we used rWrapper earlier.

RStudio-with-my-packages = rstudioWrapper.override{ packages = with rPackages; [ ggplot2 dplyr xts ]; };

Jupyter Notebook

Use jupyterWith

This shell.nix file creates a jupyter environment with the IRKernel available.

{ pkgs ? import <nixpkgs> {} }:                                                 
let                                                             
  jupyter = import (pkgs.fetchFromGitHub {                                      
    owner = "tweag";                                                            
    repo = "jupyterWith";                         
    # Replace this with current revision.                              
    rev = "269999caa8d506e93ff56c8643cecb91ded2fdef";                           
    sha256 = "08iig872ay8d711n2gbfzrf496m9x9a9xwr0xca9hn7j61c3xr43";            
    fetchSubmodules = true;                                                     
  }) {};                                                                        
                                                                                
  kernels = jupyter.kernels;                                                    
                                                                                
  irkernel = kernels.iRWith {                
      name = "nixpkgs";                                                         
      # Libraries to be available to the kernel.                                
      packages = p: with p; [                                                   
        ggplot2                                                          
      ];                                           
    };                                                                          
                                                                                
  jupyterEnvironment = (jupyter.jupyterlabWith {                                
      kernels = [ irkernel ];                                                   
    });                                                                         
in                                                                              
  jupyterEnvironment.env

R with Lorri

An example of a shell.nix for usage with lorri is shown below:

let
  pkgs = import <nixpkgs> {};
in
  pkgs.mkShell {
    buildInputs = with pkgs; [
      R
      rPackages.rmarkdown
      rPackages.knitr
    ];
  }

R with Flakes and nix-direnv

R and accompanying R-packages can be installed using a Flake and then managed/activated with nix-direnv to create a reproducible development environment. After the initial setup of nix-direnv (instructions provided on the GitHub README), there is a flake template provided by the nix-direnv maintainers to get started. Run nix flake new -t github:nix-community/nix-direnv . to initialize the flake template in your current directory. This will create a `flake.nix` file that can be edited to setup the R-environment:

{
  description = "A basic flake with a shell";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system: let
      pkgs = nixpkgs.legacyPackages.${system};
    in {
      devShells.default = pkgs.mkShell {
        nativeBuildInputs = [ pkgs.bashInteractive ];
        buildInputs = with pkgs; [ R rPackages.pagedown chromium pandoc ];
       };
    });
}

Saving the file and then running direnv allow in the terminal of the project directory will execute the `flake.lock` and build the shell. This will install the current version of R and the R-package {pagedown} that is in <nixpkgs>. Note additional system dependencies may need installed for certain packages to work such as pandoc for document conversion with {rmarkdown}. Here, chromium is installed in the `buildInputs` so the chrome_print function can be used from {pagedown}.

Emacs has support for direnv which can be setup to use R with ESS. Direnv functionality can also be set in Doom Emacs under :tools in the `init.el` file in `.doom.d` folder.

Install an R-package from GitHub

The R-packages available in <nixpkgs> are generated from a recent snapshot of CRAN. You may find certain packages a version behind or want to install a package not on CRAN/Bioconducter. R-packages can be installed from GitHub using `buildRPackage` and `fetchFromGitHub`. An example of installing {rmarkdown} from GitHub using a Flake:

{
  description = "A basic flake with a shell";
  inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixpkgs-unstable";
  inputs.flake-utils.url = "github:numtide/flake-utils";

  outputs = { self, nixpkgs, flake-utils }:
    flake-utils.lib.eachDefaultSystem (system: let
      pkgs = nixpkgs.legacyPackages.${system};
      rmark = pkgs.rPackages.buildRPackage {
        name = "rmarkdown";
        src = pkgs.fetchFromGitHub{
          owner = "rstudio";
          repo = "rmarkdown";
          rev = "b87ca50c8c4d5a5876333b598aed4eb84de925a3";
          sha256 = "12mhmmibizbxgmsns80c8h97rr7rclv9hz98zpgsl26hw3s4l0vm";
        };
   propagatedBuildInputs = with pkgs.rPackages; [bslib evaluate jsonlite knitr stringr tinytex yaml xfun];
      };
    in {
      devShells.default = pkgs.mkShell {
        nativeBuildInputs = [ pkgs.bashInteractive ];
        buildInputs = with pkgs; [ R rmark pandoc ];
      };
    });
}

You will need to obtain the `rev` and `sha256` for the package on github which can be found by using the `nix-prefetch-git` command line tool. For the above example, running nix-prefetch-git https://github.com/rstudio/rmarkdown from a terminal will generate the information. You may need to manually specify other R-package/system dependencies for the specific package in the `propagatedBuildInputs`. This information can be found in the `DESCRIPTION` file of the R-package source directory.

A note on knitr

To knit a .Rmd file to a pdf (or .Rnw), you need to have included in your envronment pkgs.texlive.combined.scheme-fullas well as pandoc or it will fail to knit. None of the other texlive packages contain the proper "frame" package. Note there are likely other workarounds but this requires the least effort.

Other Editors

with vim - nvim-r


with emacs - emacs speaks statistics

External Documentation

Officer package

When the R package "officer" has been installed from the Nix package manager, "save_as_docx" does not work:

Error in write_xml.xml_document(private$doc, file = private$filename) : Error closing file Calls: save_as_docx ... print.rdocx -> <Anonymous> -> write_xml -> write_xml.xml_document In addition: Warning messages: 1: In write_xml.xml_document(private$doc, file = private$filename) : Permission denie [1501] 2: In write_xml.xml_document(private$doc, file = private$filename) : Permission denie [1501]

However officer does work if installed using the conventional install.packages() which can be enabled as discussed in https://churchman.nl/tag/r/