R: Difference between revisions
imported>Josephsdavid Added dependency description for knit to pdf |
Add a section for positron. |
||
(13 intermediate revisions by 10 users not shown) | |||
Line 24: | Line 24: | ||
</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> | </syntaxhighlight>Other utilities like rWrapper are not compatible. | ||
== | == Jupyter Notebook == | ||
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 { | ||
<syntaxhighlight lang = "nix"> | 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> | </syntaxhighlight> | ||
== R with Lorri == | == R with Lorri == | ||
An example of a '''shell.nix''' for usage with [https://github.com/ | 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 100: | Line 99: | ||
</syntaxhighlight> | </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?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 106: | Line 166: | ||
== Other Editors == | == Other Editors == | ||
'''with vim''' - [ | '''with vim''' - [[Nvim-r | nvim-r]] | ||
'''with emacs''' - [http://ess.r-project.org/ emacs speaks statistics] | '''with emacs''' - [http://ess.r-project.org/ emacs speaks statistics] | ||
Line 114: | Line 173: | ||
== External Documentation == | == External Documentation == | ||
* [https://nixos.org/nixpkgs/ | * [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]] |