1

私はクラスターを介してジョブを分散しているので、各マシンに移動して適切なパッケージを手動でインストールしたくありません。ジョブコントローラーは誰もスクリプトを実行しないため、インストール用に議論の余地のない書き込み可能なパスを指定する必要があります。私は実際にこの実用的な解決策を持っていました:

`%ni%` = Negate(`%in%`) ### "not in"
.libPaths("/tmp/") ### for local (remote non super user) install of packages
if ("xxx" %ni% installed.packages()) {install.packages("xxx", repos = "http://cran.r-project.org", lib="/tmp/")}
# ... and more
library(xxx)
# ... and more

最初はうまくいきましたが、1週間後に奇妙な問題が発生しました。

> library(xxx)
Error in library(xxx) : there is no package called 'xxx'

xxx(およびその他のパッケージ)はinstalled.packages()のマニフェストにあり、.libPathsはパス上の/ tmp /を報告し、lsは/tmp/内のパッケージのフォルダーを示します。install.packagesを使用して再インストールすると、remove.package、update.package、およびfind.packageと同様に、エラーがスローされます。

2つの質問:リモートインストールを管理する必要がある別の方法はありますか?
パッケージのロードに失敗したときに問題が発生した原因は何ですか?

次のような応急修理を実装する必要がないようにしてください

locdir <- paste("/tmp/", as.integer(runif(1, 1, 100000)), sep='')
system(paste("mkdir", locdir))
.libPaths(locdir)
install.packages("xxx", repos = "http://cran.r-project.org", lib=locdir)
library(xxx)
4

1 に答える 1

2

オプションが必要な場合がありますcharacter.only = TRUEが、コードが以前は機能していたが、現在は機能していないのは奇妙です。とにかく、この関数を試してください:

packageLoad<-function(libName){
    # try to load the package
    if (!require(libName,character.only = TRUE)){ 
      # if package is not available, install it
      install.packages(libName,dep=TRUE, 
         repos="http://cran.r-project.org",lib="/tmp/",destdir="/tmp/")
      # try again
      if(!require(libName,character.only = TRUE)) 
         stop(paste("Package ",libName," 
            not found and its installation failed."))
    }
}
于 2013-03-08T21:16:29.680 に答える