4

实际问题

是否可以在需要/加载包后覆盖对包(重新)安装的阻止?

我知道,一旦包被使用,阻止“真正”重新安装到加载包的同一个库是非常有意义的。但我的用例有点不同

背景

我喜欢拥有一个“沙盒库”来测试自己的包的想法。除了要测试的包之外,这些沙箱库还包含干净的基础 R 安装的所有基础包以及一些必要的 contrib 包,以便我的整个包构建和测试框架能够正常工作(例如digeststringr等等)。但是,我的框架从标准库加载了后者的包,然后需要将它们安装到沙箱库 - 这被阻止了。因此,我的问题是是否可以覆盖它,因为我并没有真正做人们在实施该块时所想到的事情。

插图

指定两个库的路径

lib         <- file.path(R.home(), "library")
lib.sandbox <- file.path(tempdir(), "library")

创建沙盒库

dir.create(lib.sandbox, showWarnings=FALSE)

将包安装到标准库并加载它

install.packages("digest", lib=lib)
require("digest", lib.loc=lib)

然后也安装到沙盒库

> install.packages("digest", lib=lib.sandbox)
Warning: package 'digest' is in use and will not be installed

我的框架在加载某些也应该安装到沙盒库的包之后计算出某些东西,所以我不能将“安装到沙盒库”步骤放在初始加载步骤之前。

4

3 回答 3

2

这是您在回答中建议的一般版本。这将在安装之前卸载包,然后从同一位置重新加载包。

install.packages.sandbox <- function(pkgs, lib, repos=getOption("repos"), ...) {
    if (is.null(repos)) 
        stop("Can't install from source. Need package name.")
    pkg.pos <- grep(pkgs, search())
    pkg.path <- searchpaths()[grep(pkgs, searchpaths())]
    in.use <- length(pkg.pos) > 0
    # detach
    if (in.use) do.call(detach, 
                  list(pkg.pos), 
                  envir=.GlobalEnv)
    # install
    utils::install.packages(pkgs, lib, repos, ...)
    # re-attach from original library location
    if (in.use) library(pkgs, 
                  character.only=TRUE, 
                  lib.loc=.libPaths()[sapply(.libPaths(), grepl, pkg.path)])
}
于 2012-10-31T18:43:39.187 回答
1

不是我在概念上追求的,而是一种实用的解决方法:在安装之前分离包

指定两个库的路径

lib         <- file.path(R.home(), "library")
lib.sandbox <- file.path(tempdir(), "library")

创建沙盒库

dir.create(lib.sandbox, showWarnings=FALSE)

将包安装到标准库并加载它

install.packages("digest", lib=lib)
require("digest", lib.loc=lib)

拆包

detach(package:digest)

然后也安装到沙盒库

> install.packages("digest", lib=lib.sandbox)
trying URL 'http://cran.at.r-project.org/bin/windows/contrib/2.15/digest_0.5.2.zip'
Content type 'application/zip' length 79053 bytes (77 Kb)
opened URL
downloaded 77 Kb

package 'digest' successfully unpacked and MD5 sums checked

The downloaded binary packages are in
    C:\Users\wwa418\AppData\Local\Temp\Rtmp6XSVYq\downloaded_packages
于 2012-10-31T18:07:28.063 回答
0

除了已经提到的搜索路径更改方法之外,可能值得注意的是,此警告和行为来自(至少从 R 3.6.2 开始)来自utils:::.install.winbinary对附加包进行检查的地方。

因此,为了避免这个问题,我们可以做的是不使用二进制安装方法,而是从源代码安装包:

library(digest)
utils::install.packages("digest", lib = tempdir(), type = "source")

如果包需要编译 C/C++/Fortran 代码,这当然会带来一些潜在的警告,如help("install.packages")为 Windows 编写的:

如果包不包含需要编译的 C/C++/Fortran 代码,则使用 type = "source" 的包总是有效的。否则,您将需要按照“R for Windows FAQ”中的说明安装 Rtools 集合,并且您必须按照 Rtools 的要求设置 PATH 环境变量。

...

于 2020-03-29T11:59:15.453 回答