1. ホーム
  2. r

[解決済み] Rscriptです。というパッケージは存在しないのですが・・・?

2022-02-10 09:47:29

質問

Rscriptを使用してRファイルをバッチモードで実行したいのですが、必要なライブラリが読み込まれないようです。具体的には、以下のようなエラーが発生します。

Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted

しかし、私はパッケージ timeSeries で、Rstudio、RGui、Rのコマンドラインから問題なく読み込むことができます。問題はRscriptを使用してスクリプトを実行するときだけのようです。

私のシステム/環境変数は次のように設定されています。

C:\Program Files\R\R-3.1.0\bin\x64 (Appended to PATH)
R_HOME = C:\Program Files\R\R-3.1.0
R_User = Patrick

同じバージョンのRをRStudio、RGui、コマンドラインからのRで動かしています。また .Library をこの3つのソースから取得し、同様に同じ出力が得られました。

Rで使っている(インストールしている)パッケージで、コマンドラインからRscriptを実行するにはどうしたらよいでしょうか?

EDIT

を経由してRscriptを使用しています。 Rscript script.r があるディレクトリで、Windowsのコマンドラインから script.r が配置されています。

の出力は Rscript -e print(.Library)[1] "C:/PROGRA~1/R/R-31~1.0/library"

というのは、先ほどの他の3つの選択肢と一致します。 [1] "C:/PROGRA~1/R/R-31~1.0/library"

ところが、これをスクリプトに書いてみると。

print(.libPaths()) 
library(timeSeries) #This is the package that failed to load

という出力が出る。

[1] "C:/Program Files/R/R-3.1.0/library"
Error in library(timeSeries) : there is no package called 'timeSeries'
Execution halted

RStudio の対応する呼び出しは、パッケージが実際にインストールされる場所への追加パスを提供します。

> print(.libPaths())
[1] "C:/Users/Patrick/Documents/R/win-library/3.1" "C:/Program Files/R/R-3.1.0/library"    

  

解決方法は?

要するに Sys.getenv('R_LIBS_USER') は、R.exe でこれをコマンドラインで呼び出したときと同じ値である必要があります。

Rscript.exe -e "Sys.getenv('R_LIBS_USER')"

そして の場合、このコマンドライン呼び出しに上記の値が含まれている必要があります。

Rscript.exe -e ".libPaths()"

注意事項 の値は R_LIBS_USER の値が異なる場合、R.exe と Rscript.exe で異なる場合があります。 R_USER が変更された場合 .Rprofile または へのショートカットのターゲットフィールドにある R.exe と、一般的には、ユーザーライブラリ(つまり .libPaths()[2] は、Rscript.exe に設定されていないだけです。

を設定するのが好きなので R_USER を私の USERPROFILE の先頭に、以下のブロックを挿入しています。 .R 複数のコンピュータで実行したいファイルや、Rscript.exeの中で実行したいファイル .Rprofile (例 Rscript -e "path.expand('~/.Rprofile')" ):

# =====================================================================
# For compatibility with Rscript.exe: 
# =====================================================================
if(length(.libPaths()) == 1){
    # We're in Rscript.exe
    possible_lib_paths <- file.path(Sys.getenv(c('USERPROFILE','R_USER')),
                                    "R","win-library",
                                    paste(R.version$major,
                                             substr(R.version$minor,1,1),
                                             sep='.'))
    indx <- which(file.exists(possible_lib_paths))
    if(length(indx)){
       .libPaths(possible_lib_paths[indx[1]])
    }
    # CLEAN UP
    rm(indx,possible_lib_paths)
}
# =====================================================================