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
...
总结
- 我安装了 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
- 运行宁Windows10
- 环境变量的区别可以看这里(右边是Rstudio,左边是Rscript):https://pasteboard.co/IasIVMe.png
(我在这里的编辑被删除以保持干净。查看我的回答(或历史记录)以了解更多信息)
我尝试了不同的环境变量配置,看看来自源的installing/compiling是否可以由Rscript.exe[=66=执行 ]实例运行install.packages
.
(从 Rstudio 控制台工作时,它的工作方式不同(限制较少)。它似乎识别 注册表项。它工作时根本没有指定环境变量)。
- 设置
MAKE
变量 (Sys.setenv(MAKE = 'C:\Rtools\bin\make.exe')
)(部分成功)
- 设置
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
(失败)
- 仅设置
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")))
不足以证明您的环境已准备好从源构建。
我正在开发一个支持与另一种形状的库结构交互的包,该库结构支持并行安装包的多个版本(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
...
总结
- 我安装了 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
- 运行宁Windows10
- 环境变量的区别可以看这里(右边是Rstudio,左边是Rscript):https://pasteboard.co/IasIVMe.png
(我在这里的编辑被删除以保持干净。查看我的回答(或历史记录)以了解更多信息)
我尝试了不同的环境变量配置,看看来自源的installing/compiling是否可以由Rscript.exe[=66=执行 ]实例运行install.packages
.
(从 Rstudio 控制台工作时,它的工作方式不同(限制较少)。它似乎识别 注册表项。它工作时根本没有指定环境变量)。
- 设置
MAKE
变量 (Sys.setenv(MAKE = 'C:\Rtools\bin\make.exe')
)(部分成功) - 设置
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
(失败)
- 包括所有 Rtools bin 目录 (
- 仅设置
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")))
不足以证明您的环境已准备好从源构建。