r - Install.packages 在 Rstudio 控制台中安装源代码,但在使用 Rscript 时为二进制



我正在开发一个支持与替代形状的库结构交互的包,该库结构支持并行安装包的多个版本(RVClibrary,即将在CRAN上安装)。最近,我遇到了一些奇怪的行为,希望有人能解释一下。

安装软件包时,它有时可能具有比二进制版本更高的版本。在这种情况下,源代码(未编译的 C 代码)尚未编译(由...?),但包含比已编译的二进制版本更高的版本。在我的案例中显示了以下内容:

There is a binary version available but the source version is later:
binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE

用户可以选择是应该相对安装还是编译 A 或 B。换句话说,如果你想要版本 0.2.0 或 0.3.4(你需要 Rtools)。

设置install.packages.compile.from.source选项时,不会提供此选项。

> options(install.packages.compile.from.source = "always")
> install.packages('rlang', lib = "C:\test", quiet = TRUE, repos = "http://cran.us.r-project.org")
There is a binary version available but the source version is later:
binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE
installing the source package ‘rlang’

已安装。

但是当我创建一个简单的脚本(我将其命名install_test.R):

packageName <- commandArgs(trailingOnly = TRUE)[1]
cat(packageName, 'n')
options(install.packages.compile.from.source = "always")
install.packages(packageName, lib = "C:\test", quiet = TRUE, repos = "http://cran.us.r-project.org")

以下行为与 R 中的系统相同,直接在 CMD 中也是如此(
确保在环境变量 PATH 中具有Rscript.exe路径)

> system("Rscript.exe C:\test\install_test.R rlang")
rlang 
There is a binary version available but the source version is later:
binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE
Binaries will be installed
package 'rlang' successfully unpacked and MD5 sums checked

二进制文件已安装!

我需要能够始终安装源版本,这样我就不会遇到依赖问题。 例如,ggplot2 已经依赖于>= 0.2.1...

总结

  • 我安装了 Rtools 3.5(devtools 可以使用两种路由找到它并认为它不兼容......,但从源代码安装在 Rstudio 中工作正常,并且 (https://cran.r-project.org/bin/windows/Rtools/) CRAN 说它兼容)
  • R 版本:
platform       x86_64-w64-mingw32
arch           x86_64
os             mingw32
system         x86_64, mingw32
year           2016
month          06
day            21
svn rev        70800
language       R
version.string R version 3.3.1 (2016-06-21)
nickname       Bug in Your Hair
  • 运行视窗 10
  • 环境变量之间的差异可以在这里看到(Rstudio在右边,Rscript在左边): https://pasteboard.co/IasIVMe.png

(我在这里的编辑被删除以保持干净。请参阅我的答案(或历史记录)以阅读更多)

我尝试了不同的环境变量配置,以查看是否可以由运行install.packagesRscript.exe 实例执行源代码安装/编译

(从 Rstudio 控制台工作时,它的工作方式不同(限制较少)。它似乎识别注册表项。它根本不指定环境变量即可工作)。

  1. 设置变量MAKE(Sys.setenv(MAKE = 'C:\Rtools\bin\make.exe')) (部分成功)
  2. 设置变量PATH(附加到开头)
    • 包括所有 Rtools bin dirs (C:\Rtools\bin;C:\Rtools\mingw_32;C:\Rtools\mingw_64) (成功)
    • 仅包括工具C:\Rtools\bin(成功)
    • 仅包含 RtoolsC:\Rtools\bin(到 PATH 变量的末尾) (成功)
    • 仅包括 RtoolC:\Rtools\mingw_32(失败)
    • 仅包含 RtoolsC:\Rtools\mingw_64(失败)
  3. 仅设置PATH,而不设置MAKE变量。

在设置以下属性的条件下:options(install.packages.compile.from.source = "always")

解决方案 1:
install.packages函数通过查找"MAKE"环境变量nzchar(Sys.which(Sys.getenv("MAKE", "make")))来"检查"是否应该尝试从源代码构建。不幸的是,如果您只指定 MAKE 环境变量,您必须提供完整的路径才能使其(Sys.which)工作,它仍然找不到所有必需的源构建工具(Rtools/bin),这些工具似乎是必要的,并且在没有任何澄清的情况下崩溃:

> Sys.setenv(MAKE = 'C:\Rtools\bin\make.exe')
> system("Rscript.exe C:\R_projecten\test\install_test.R rlang")
There is a binary version available but the source version is later:
binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE
installing the *source* package 'rlang'
Warning messages:
1: running command '"C:/PROGRA~1/R/R-33~1.1/bin/x64/R" CMD INSTALL -l "C:R_projectentesttest4" C:UsersSB947~1.FROAppDataLocalTempRtmpwbEcl6/downloaded_packages/rlang_0.3.4.tar.gz' had status 1 
2: In install.packages(packageName, lib = "C:\R_projecten\test\test4",  :
installation of package 'rlang' had non-zero exit status

所以解决方案 1 是不够的,甚至可以用解决方案 3 代替:

PATH : C:Program FilesRR-3.3.1binx64; ....  ;C:Rtoolsbin; 
MAKE : 
There is a binary version available but the source version is later:
binary source needs_compilation
rlang  0.2.0  0.3.4              TRUE
installing the source package 'rlang'

如图所示,仅在 PATH 中提供C:/Rtools/bin,没有 MAKE 变量就足够了。

该检查描述了先前检查 MAKE 变量是否存在并使用该值,否则它将查找程序名称(默认为Sys.getenvmake)。仅指定 PATH 时,可以找到make(.exe)文件,并且不需要 MAKE env var。额外的好处是已经指向显然需要更多文件的 Rtools/bin 目录。

我仍然想知道哪些文件...

注意:检查nzchar(Sys.which(Sys.getenv("MAKE", "make")))不足以证明您的环境已准备好从源代码构建。

相关内容

  • 没有找到相关文章

最新更新