如何用Nix创建含R包data.table的环境?解决变量未定义错误
解决Nix Flake中R包data.table的名称错误问题
问题场景
你尝试用以下Nix Flake配置创建包含RStudio、R、Shiny和data.table的虚拟环境:
{ description = "virtual environment with Rstudio, R, Shiny"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; rWrapper=pkgs.rWrapper; rstudioWrapper=pkgs.rstudioWrapper; rstudioServerWrapper=pkgs.rstudioServerWrapper; Rpackages=with pkgs.rPackages;[ shiny data.table ]; RwithPackages= rWrapper.override{ packages = Rpackages;}; RStudio-with-my-packages = rstudioWrapper.override{ packages = Rpackages; }; myDevTools = [ #qtbase #patch RwithPackages RStudio-with-my-packages ]; in { devShells.default = pkgs.mkShell { buildInputs = myDevTools; }; }); }
运行时触发错误:
error: undefined variable 'data'
原因是Nix不允许变量名包含点号,R包data.table在Nixpkgs中使用了替代命名。
解决方法
1. 查找R包的正确Nix名称
使用nix search命令在nixpkgs中搜索目标R包:
nix search nixpkgs rPackages.data
搜索结果中会列出所有以data开头的R包,其中data.table对应的Nix包名为dataTable(将点号替换为驼峰命名)。
2. 修改Flake配置
将配置中Rpackages列表里的data.table替换为dataTable,修改后的完整配置如下:
{ description = "virtual environment with Rstudio, R, Shiny"; inputs.nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable"; inputs.flake-utils.url = "github:numtide/flake-utils"; outputs = { self, nixpkgs, flake-utils }: flake-utils.lib.eachDefaultSystem (system: let pkgs = nixpkgs.legacyPackages.${system}; rWrapper=pkgs.rWrapper; rstudioWrapper=pkgs.rstudioWrapper; rstudioServerWrapper=pkgs.rstudioServerWrapper; Rpackages=with pkgs.rPackages;[ shiny dataTable ]; RwithPackages= rWrapper.override{ packages = Rpackages;}; RStudio-with-my-packages = rstudioWrapper.override{ packages = Rpackages; }; myDevTools = [ #qtbase #patch RwithPackages RStudio-with-my-packages ]; in { devShells.default = pkgs.mkShell { buildInputs = myDevTools; }; }); }
现在重新运行nix develop即可正常创建包含所需R包的虚拟环境。
内容的提问来源于stack exchange,提问作者Pierre-olivier Gendraud
相关产品推荐
相关产品推荐

