11

实际上,我正在评估不同的解决方案以增强/探索我的 R/Python 科学工作流程中的可重复性:具有可重复分析(绘图、分析)和纸张的数据。

如您所知,有两种大的 linux 风格提供了一些解决方案:Nix 和 Guix

在 nix 中,通常描述的使用 R 开发的方式是,例如,使用rWrapperand rPackages

pkgs.rWrapper.override{ packages = with pkgs.rPackages; [tidyverse rmarkdown]; };

我的问题(不是那么……)很简单,就像 Python 一样,众所周知,R 在可重现性方面是一场噩梦,即使在中期也是如此。为了好玩,您可以尝试使用最新版本的 R 运行 2 年的 ggplot2 代码...

为了提出从科学论文的相同数据产生相同结果的薄片,我有兴趣在推导中修复 R 的版本和用于计算分析或绘图的 R 包的版本。

{
description = "Generate R result from simulation";

inputs = {
    nixpkgs.url = "nixpkgs/nixos-20.09";
    utils.url = "github:numtide/flake-utils";

};

outputs = {self, nixpkgs, utils, mach-nix } : (utils.lib.eachDefaultSystem
    (system :
    let
        pkgs = nixpkgs.legacyPackages.${system};
        REnv = pkgs.rWrapper.override{ packages = with pkgs.rPackages; [tidyverse rmarkdown]; };

        buildRScripts = { stdenv, fetch,... }: stdenv.mkDerivation {
        name = "myscript";
        src = self;
        nativeBuildInputs = [ REnv ];
        dontBuild = true;
        buildInputs = [ pkgs.pandoc pkgs.unzip ];
 
        installPhase=''
            mkdir $out
            cd $out
            ${REnv}/bin/Rscript -e 'rmarkdown::render("test.Rmd")
        '';
  in {
      defaultPackage = self.packages.${system}.buildRScripts;
     }
  ));}

例如,我怎样才能更精确地定义我想使用的编译我的test.Rmd,只有 tidyverse 1.3.1 和 R 4.1.O ?即使在5年内?

我发现 Guix 显示了 R 和 tidyverse 的不同可用包/版本:

tidyverse.1.3.1 所需的版本清楚地呈现:

在我搜索一种方法来实现类似rPackagesNix东西,即。一种将 R 或 R 包的版本显式引用到派生中的方法,但我没有找到它。

有了 rPackages nix 开发者已经提供了很好的基础,但也许我们需要更多......

我们如何才能使用 Nix 共同在 R 包上实现更好的可重复性?我对任何想法感兴趣?

或许我们可以直接从 cran 档案中获取包源并进行编译?例如 tidyverse :

Ps :我知道 Nix 和 Guix 都是https://archive.softwareheritage.org/的合作伙伴,这是存档和调用 cran 包的好方法:

Ps:答案也可以添加到https://nixos.wiki/wiki/R

更新 1

在与 nix discord 上的一些伟人讨论后,我了解到 nix 不需要版本,因为flake.nix + flake.lock存储哈希(请参阅 nix flake metadata)将我的构建和下载与 nixpkgs 上的非常具体的提交联系起来。

但这并不能解决:

  • RPackages 在这个非常具体的提交中声明的这个包链接/需要的 tar.gz 源的问题?我想软件遗产会在这一点上有所帮助吗?
  • 一些 R 版本和 R 版本的包之间不兼容的常见问题。例如,您使用 R 3.0.0 和 tidyverse 1.2.3 编写代码,您更新您的 R 版本,因为其他一些包需要更新,并且仅适用于 R 3.2.0 可用的依赖项,但是ahum, tidyverse 1.2.3 不要对于 R 3.2.0 不存在...修复版本和访问旧的 tar.gz 解决了这个问题的一部分,我想。

我们如何使用 nix 定义这样的东西?

更新 2

似乎有人建立了一个非官方索引来帮助人们使用 tidyverse 搜索旧版本的包 Ex: https ://lazamar.co.uk/nix-versions/?channel=nixpkgs-unstable&package=r-tidyverse

感谢@dram 提供链接和讨论。

4

0 回答 0