Лучшая воспроизводимость пакетов rPackages (pin-версия пакетов) в nix по сравнению с guix

На самом деле я оцениваю другое решение для улучшения / исследования воспроизводимости в моем научном рабочем процессе R / Python : данные с воспроизводимым анализом (график, анализ) и бумага.

Как вы знаете, есть две большие разновидности Linux, которые предлагают некоторые решения: Nix и Guix.

В nix обычно описывается способ разработки с использованием R, например, использование rWrapper а также :

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

Моя проблема (не так ...) проста, как и Python, R, как известно, кошмар с точки зрения воспроизводимости, даже в среднесрочной перспективе. Ради интереса вы можете попробовать запустить код ggplot2 за 2 года с последней версией R ...

Чтобы предложить отщепку, которая дает тот же результат на основе одних и тех же данных для научной статьи, мне интересно исправить при выводе версию 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, только тидиверс 1.3.1 с R 4.1.O? Даже через 5 лет?

Я обнаружил, что Guix показывает разные доступные пакеты / версии R и tidyverse:

Версия, необходимая tidyverse.1.3.1, четко представлена:

С участием rPackages в Nixя ищу способ добиться чего-то подобного, т.е. способ явно сослаться на версию пакетов R или R в производных, но я не нашел его.

С rPackages здесь nix developper уже предлагает отличное финансирование, но, возможно, нам нужно больше ...

Как мы могли коллективно добиться лучшей воспроизводимости пакетов R с помощью Nix? Меня интересуют какие-нибудь идеи?

Может быть, мы могли бы получить исходники пакетов прямо из архива Cran и скомпилировать его? Например, с tidyverse:

Ps: я знаю, что Nix и Guix являются партнерами с https://archive.softwareheritage.org/, отличным способом архивировать и вызывать пакет Cran:

Ps: ответ тоже можно было добавить на https://nixos.wiki/wiki/R

Обновление 1

После обсуждения с некоторыми замечательными людьми на nix discord я понял, что nix не нуждается в версии, потому что flake.nix + flake.lock store hash (см. метаданные nix flake), которые связывают мою сборку и загрузку с очень конкретным коммитом на nixpkgs.

Но это не решает:

  • проблема с источниками tar.gz, связанными / необходимыми для этих пакетов, объявленных в этом очень конкретном коммите RPackages? Полагаю, наследие программного обеспечения поможет в этом вопросе?
  • общая проблема несовместимости между некоторыми версиями R и версиями пакетов R. Например, вы пишете код с R 3.0.0 и tidyverse1.2.3, вы обновляете свою версию R, потому что некоторые другие пакеты нуждаются в обновлении и работают только с зависимостями, доступными с R 3.2.0, но ахм , tidyverse1.2.3 не не существует для R 3.2.0 ... Исправление версии и доступ к старому tar.gz решают часть этой проблемы, я полагаю.

Как мы определяем что-то подобное с помощью nix?

Обновление 2

Кажется, кто-то создал неофициальный индекс, чтобы помочь людям искать старую версию пакета Ex с помощью tidyverse: https://lazamar.co.uk/nix-versions/?channel=nixpkgs-unstable&package=r-tidyverse

Спасибо @dram за ссылку и обсуждение этого вопроса.

0 ответов

Другие вопросы по тегам