我实际上正在评估不同的解决方案来增强/探索我的 R/Python 科学工作流程中的可重复性:具有可重复分析(绘图、分析)和论文的数据。
如您所知,两大 Linux 风格提供了一些解决方案:Nix 和 Guix
在 nix 中,通常描述的使用 R 开发的方式是,例如使用
rWrapper
和 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
,仅使用 R 4.1.O 的 tidyverse 1.3.1 ?即使是5年后?
我发现 Guix 显示了不同的可用软件包/版本的 R 和 tidyverse :
tidyverse.1.3.1 所需的版本已清晰呈现:
随着
rPackages
中的 Nix
我寻找一种方法来实现类似的目标,即。一种明确引用 R 或 R 包版本进行推导的方法,但我没有找到它。
有了 rPackages here 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 元数据),将我的构建和下载与 nixpkgs 上非常具体的提交链接起来。
但这并不能解决问题:
我们如何使用 nix 定义这样的东西?
更新2
似乎有人建立了一个非官方索引来帮助人们使用 tidyverse 搜索旧版本的软件包 Ex :https://lazamar.co.uk/nix-versions/?channel=nixpkgs-unstable&package=r-tidyverse
感谢@dram 对此的链接和讨论。
在 nix Discord 上,向我建议了以下内容:将 nixpkgs 的版本固定到特定提交,如下所示:
pkgs = import (fetchTarball "https://github.com/NixOS/nixpkgs/archive/e8c38b73aeb218e27163376a2d617e61a2ad9b59.tar.gz") {};
并且仅将这个固定的
pkgs
用于 R 及其所有包。 (您可以对您想要接收更新的其他软件包使用 updated_pkgs = import <nixpkgs> {};
,即使是在同一个开发 shell 中也是如此。
因此,如果某个时刻 R 和相关包通过了您的测试,则获取哈希值,您可以随时参考。如果您将开发 shell 的
default.nix
检查到 git 中,这应该会勾选您的所有框。