3

以前にこの質問をしましたが、それでも機能させることができません。Rの起動時にカスタムパッケージをインストールしようとしています。現在私たちが作成したコードの多くは、ユーザーが編集できるようになっています。コードを保護するために、私は本番レベルのコードをパッケージ化し、ユーザーに起動時に自分のマシンにインストールしてもらいます。

ただし、RProfile.siteファイルにパッケージをインストールしようとすると、プログラムがループに入り、Rが何度も起動されます。パッケージのロックファイルが、R内のライブラリフォルダーにパッケージと一緒に作成されていることに気付きました。

これが私がサイトファイルに追加したコードです:

if(length(grep("customPackage", installed.packages()[,1]))==0) { 
        install.packages("customPackage", repos=NULL, type="source") 
} 

Rを起動した後に(サイトファイルを変更せずに)このコードを実行しようとすると、パッケージが完全に正常にインストールされ、次に進みます。ただし、RProfileファイルを使用して実行しようとすると、問題が発生します。

前回この問題を解決しようとしたとき(https://stackoverflow.com/questions/10610067/installing-packages-upon-starting-r-session)、パッケージにifステートメントチェックを使用するというジャスティンの提案で問題が解決すると思いました。しかし、これは私がCRANからインストールしたパッケージの問題を解決するだけで、カスタムパッケージの問題は解決しないようです。

この問題に関する助けをいただければ幸いです。

4

3 に答える 3

4

なぜあなたがこれをしたいのか分かりません。同じ場所を指さしてもらうだけ.libPathsです。つまり、の代わりにinstall.packages(...)、Rprofile.siteに次のような行を追加するだけです。

.libPaths('/path/to/common/libraries')
require("commonPackage")

あなたができるかもしれないもう一つのことはsystem電話をかけることです。Windowsでのパッケージのインストールについてはよくわかりませんが、Unixライクでは、使用install.packagesする代わりに次のようにすることができます。

system("R --vanilla CMD INSTALL customPackage")

特に、--vanillaフラグにより​​、Rprofile.siteファイルを使用せずにRが開始されます(問題は、Rの開始時にRprofile.siteファイルが読み取られているが、Rprofile.siteファイルはRに開始が必要なパッケージをインストールするように指示していることです。 Rは、Rprofile.siteファイルを読み取ります...など)。おそらく、R --no-site-file INSTALL customPackageうまくいくでしょう。

編集

このSOの回答を調べたところ、私はテストしていませんが、Windowsでこのようなことを実行できるようです(Rtoolsをインストールしていると仮定します) 。

system("Rcmd --vanilla INSTALL customPackage")
于 2012-07-17T21:23:17.503 に答える
2

GSeeが言ったように、問題はinstall.packages実行R CMD INSTALLされることです。これにより、Rprofile.siteファイルを読み取る新しいRプロセスが開始され、ループが発生します。邪悪なループを断ち切る2つの方法:

  1. Rがインタラクティブに実行されていることを確認します。

    if (interactive() && 
        length(grep("customPackage", installed.packages()[,1]))==0) { 
      install.packages("customPackage", repos=NULL, type="source") 
    }
    

    interactive()が実行中の場合はFALSER CMDであるため、これによりループが中断されます。

  2. R_PROFILE環境変数を空または無効な値に設定して、のRセッションR CMDが実行されないようにします。Rセッションの開始時の初期化は次のように述べています。

    '〜/ .Renviron'または'〜/ .Rprofile'を子Rプロセス(RCMDチェックおよびRCMDビルドによって実行されるプロセスなど)で無視する場合は、適切な環境変数R_ENVIRON_USERまたはR_PROFILE_USERを(可能であれば)に設定します。 、Windowsにはありません)""または存在しないファイルの名前。

    これをRprofile.siteに適合さR_PROFILEせると、を呼び出す前に、空のファイルまたは存在しないファイルに設定できますinstall.packages。例えば:

    if (length(grep("customPackage", installed.packages()[,1]))==0) { 
      Sys.setenv(R_PROFILE = "/dev/null")
      install.packages("customPackage", repos=NULL, type="source") 
      Sys.unsetenv("R_PROFILE")
    }
    

    次に、Rが再起動してパッケージをインストールすると、空のRprofile.siteファイルが読み取られるため、ループが中断されます。

    の呼び出しinstall.packagesが.Rprofileにある場合はR_PROFILE_USER、同じ方法で設定できます。

最初の方法はより単純で、既存の値を上書きすることを心配する必要はありませんR_PROFILE

于 2019-04-05T16:14:47.503 に答える
0

以下の関数を使用して、リロードせずにパッケージをインストールできます.Rprofile

surround <- function(x, with) {
  paste0(with, x, with)
}

peq <- function(x, y) paste(x, y, sep = " = ")

install.packages.vanilla <- function(pkgs, ...){

  arguments <- as.list(match.call())[-1]

  if(!"repos" %in% names(arguments)){
    arguments$repos <- getOption("repos")
  }
  names_args <- names(arguments)

  installArgs <- purrr::map_chr(seq_along(arguments),
                                function(i){
                                  value <- arguments[[i]]
                                  peq(names_args[i], ifelse(length(value)<2, deparse(value), as.character(list(value))))
                                })
  installArgs <- stringr::str_replace_all(installArgs, "\"", "'")
  installCmd <- paste0("utils::install.packages(",
                       paste(installArgs, collapse = ", "),
                       ")")
  fullCmd <- paste(
    surround(file.path(R.home("bin"), "R"), with = "\""),
    "--vanilla",
    "--slave",
    "-e",
    surround(installCmd, with = "\"")
  )

  system(fullCmd)
  return(invisible())
}
于 2016-12-19T18:28:18.090 に答える