4

実際の質問

パッケージが要求/ロードされた後、パッケージの(再)インストールのブロックを無効にすることは可能ですか?

パッケージが使用された後、パッケージがロードされたのと同じライブラリへの「真の」再インストールをブロックすることは完全に理にかなっていることを理解しています。しかし、私のユースケースは少し異なります

バックグラウンド

自分のパッケージをテストするための「サンドボックスライブラリ」を用意するというアイデアが好きです。テストするパッケージに加えて、これらのサンドボックスライブラリには、クリーンなベースRインストールのすべてのベースパッケージに加えて、パッケージの構築とテストのフレームワーク全体が機能するために必要ないくつかのcontribパッケージが含まれています(例digestなどstringr)。ただし、私のフレームワークは後者のパッケージを標準ライブラリからロードしてから、それらをサンドボックスライブラリにインストールする必要があります。これはブロックされていますしたがって、ブロックを実装するときに人々が考えていたことを実際に行っていないので、これをオーバーライドすることが可能かどうかという私の質問です。

2つのライブラリへのパスを指定します

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

私のフレームワークは、サンドボックスライブラリにインストールする必要がある特定のパッケージがロードされた後に特定のものを計算するため、最初のロードステップの前に「install-to-sandbox-lib」ステップを配置できません。

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

概念的には私が求めていたものではありませんが、実用的な回避策:インストールする直前にパッケージを切り離します

2つのライブラリへのパスを指定します

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")

もちろん、help("install.packages")Windows用に記述されているように、パッケージでC / C ++ / Fortranコードのコンパイルが必要な場合は、いくつかの潜在的な注意事項があります。

type = "source"のパッケージの使用は、コンパイルが必要なC / C ++/Fortranコードがパッケージに含まれていない場合に常に機能します。それ以外の場合は、「R for Windows FAQ」で説明されているようにRtoolsコレクションをインストールし、Rtoolsの必要に応じてPATH環境変数を設定する必要があります。

..。

于 2020-03-29T11:59:15.453 に答える