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

Install.packages installs source in Rstudio console but binary when using Rscript

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

安装包时,有时 source 版本会比 binary 版本晚。在这种情况下,源代码(未编译的 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...

总结

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

(我在这里的编辑被删除以保持干净。查看我的回答(或历史记录)以了解更多信息)

我尝试了不同的环境变量配置,看看来自源的installing/compiling是否可以由Rscript.exe[=66=执行 ]实例运行install.packages.

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

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

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

解决方案 1:
install.packages 函数 'checks' 如果它应该尝试通过查找 '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_projecten\test\test4" C:\Users\SB947~1.FRO\AppData\Local\Temp\RtmpwbEcl6/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

所以方案一还不够,甚至可以用方案三代替:

   PATH : C:\Program Files\R\R-3.3.1\bin\x64; ....  ;C:\Rtools\bin; 
   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 变量是否存在,并使用该值,否则它将查找 make,程序名称(默认提供给 Sys.getenv)。仅指定 PATH 时,可以找到 make(.exe) 文件,不需要 MAKE env var。已经指向 Rtools/bin 目录的额外好处显然需要更多文件。

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

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