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

2024-02-05

实际问题

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

我明白阻止“真实”重新安装 to the same一旦使用了包,从中加载包的库就非常有意义。但我的用例有点不同

背景

我喜欢用“沙箱库”来测试自己的包的想法。除了要测试的包之外,这些沙箱库还包含干净的基础 R 安装的所有基础包plus为了使我的整个包构建和测试框架正常工作,需要一些 contrib 包(例如digest, stringrETC。)。但是,我的框架从标准库加载后一个包,并且then需要将它们安装到沙箱库中 - 该库已被阻止。因此我的问题是是否可以覆盖这一点,因为我并没有真正按照人们在实现该块时想到的那样去做。

插图

指定两个库的路径

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

我的框架解决了某些问题after某些还应安装到沙箱库的软件包已加载,因此我不能将“安装到沙箱库”步骤放在初始加载步骤之前。


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

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)])
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在需要/加载软件包后,是否可以覆盖对软件包(重新)安装的阻止? 的相关文章

随机推荐