imported>Dmvianna
direct users of Jupyter to use jupyterWith from tweag
JeppeX (talk | contribs)
m A note on knitr: : add example
 
(12 intermediate revisions by 9 users not shown)
Line 23: Line 23:
RStudio-with-my-packages = rstudioWrapper.override{ packages = with rPackages; [ ggplot2 dplyr xts ]; };
RStudio-with-my-packages = rstudioWrapper.override{ packages = with rPackages; [ ggplot2 dplyr xts ]; };
</syntaxhighlight>
</syntaxhighlight>
== Positron ==
Currently, the easiest way to use positron with nix is with mkShell:<syntaxhighlight lang="nix">
let
  pkgs = import <nixpkgs> { };
in
pkgs.mkShell {
  packages = [
    # Positron
    pkgs.positron-bin
    # R & packages.
    pkgs.R
    pkgs.rPackages.httr
    pkgs.rPackages.ggplot2
    # Python, ipykernel & packages.
    # pkgs.python313
    # pkgs.python313Packages.ipykernel # NOTE: Required for python.
    # pkgs.python313Packages.pandas
    # pkgs.python313Packages.requests
  ];
}
</syntaxhighlight>Other utilities like rWrapper are not compatible.


== Jupyter Notebook ==
== Jupyter Notebook ==


Use [https://github.com/tweag/jupyterWith jupyterWith]
Use [https://github.com/tweag/jupyterWith jupyterWith]
This '''shell.nix''' file creates a jupyter environment with the IRKernel available.
<syntaxhighlight lang = "nix" >
{ 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               
</syntaxhighlight>


== 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 43: Line 97:
   }
   }


</syntaxhighlight>
== R with Flakes and nix-direnv==
R and accompanying R-packages can be installed using a [[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?show=nix-prefetch-git&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.
== Install an R package from source ==
If you need a specific version of a package or find one that is not available in Nixpkgs, you can use `rPackages.buildRPackage` to build from source. The example below builds S4Arrays from BioConductor.<syntaxhighlight lang="nix">
let
  pkgs = import <nixpkgs> { };
  customPackage = pkgs.rPackages.buildRPackage {
    name = "S4Arrays";
    src = pkgs.fetchurl {
      url = "https://www.bioconductor.org/packages/release/bioc/src/contrib/S4Arrays_1.8.1.tar.gz";
      hash = "sha256-8f2oA0xgwI6CucXbMU1yJC4W6tiVMcDAk8D3Ur3zxw8=";
    };
    buildInputs = with pkgs.rPackages; [
      pkgs.R
      Matrix
      abind
      BiocGenerics
      S4Vectors
      IRanges
      crayon
    ];
  };
in
pkgs.mkShell {
  packages = with pkgs.rPackages; [
    pkgs.R
    Matrix
    abind
    BiocGenerics
    S4Vectors
    IRanges
    crayon
    customPackage # the package we built from source.
  ];
}
</syntaxhighlight>
</syntaxhighlight>


Line 49: Line 199:
To knit a .Rmd file to a pdf (or .Rnw), you need to have included in your envronment <code> pkgs.texlive.combined.scheme-full</code>as well as <code> pandoc </code> 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.
To knit a .Rmd file to a pdf (or .Rnw), you need to have included in your envronment <code> pkgs.texlive.combined.scheme-full</code>as well as <code> pandoc </code> 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.


If <code>R</code> is included (using wrapper) but <code>pandoc</code> is not wanted in the user environment, one can expose it just for the R with
<syntaxhighlight lang="nix">
(rWrapper.override{
  packages = with rPackages; [
    markdown
    # other plugins go also here
  ];
}).overrideAttrs (old: {
  buildInputs = (old.buildInputs or []) ++ [
    pkgs.pandoc
  ];
});
</syntaxhighlight>
== Other Editors ==
== Other Editors ==


'''with vim''' -  [https://nixos.wiki/wiki/Nvim-r nvim-r]
'''with vim''' -  [[Nvim-r | nvim-r]]




Line 58: Line 221:
== 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 ==
 
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/
 
[[Category:Languages]]