web-dev-qa-db-ja.com

R内からクリーンなRセッションを終了して再起動しますか?

R内でq()を実行し、クリーンなRセッションを再開するエイリアスを作成する方法はありますか?

そして、はい、私はq()を入力してからRを入力するのが面倒です:)

76
justin

RStudioを使用している場合:command/ctrl + shift + F10

使用することもできます

.rs.restartR()
62
mgoldwasser

Rの起動方法に応じて、これらの行のいずれかを.Rprofileファイル:

makeActiveBinding("refresh", function() { Shell("Rgui"); q("no") }, .GlobalEnv)

makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)

次に、これをRコンソールに入力します。

refresh

現在のセッションをシャットダウンし、新しいセッションを開始します。

53
G. Grothendieck

.rs.restart()はctrl + shift + F10を押すのと同じように機能することがわかりました。しかし、パッケージをアンロードしません

9

古い投稿ですが、答えはまったく機能しません(私はWindowsを使用していますが、他のユーザーはテストしていません)。そのため、ソリューションを追加します。私の用語のいくつかはここではオフになっているかもしれませんが、これは意味を理解するはずです:

上記の回答はまったく機能しません

ここで送信される回答のほとんどは、Shellまたはsystemを使用することを含みます。これらは、新しいRコンソールを開いて元のコンソールを閉じるように指示している間、新しいコンソールはプロセスであるため、まったく機能しません古いコンソールのアプリケーションコンテキストで実行されます。つまり、新しいコンソールが閉じるまで、元のコンソールは閉じることができません。 hedgedandleveredなどの上記のユーザーの一部は、元のコンソールを閉じると新しいコンソールが強制的に閉じると報告しました。試してみると、新しいコンソールは開きますが、古いコンソールは新しいコンソールが閉じられるまで凍結状態で開いたままになります。

基本的な問題は、Shellを呼び出すか、systemが元のコンソールから新しいコンテキストにアプリケーションコンテキストを変更しないため、新しいコンソールが閉じるまで元のプロセスを終了できないことです。

私のために働く代替案

代わりに、ファイルタイプに基づいてデフォルトのアプリケーションでファイルを開くために通常使用される_Shell.exec_を使用します。 .exeで使用すると、明らかに実行可能ファイルが実行されます。ただし、重要な違いは、システムが独自の独立したコンテキストでアプリケーションを起動することです。だからここに私のために働くコードがあります:

_makeActiveBinding("restart.R", function() { Shell.exec(paste0(R.home(),"/bin/x64/Rgui.exe")); q("no") }, .GlobalEnv)
_

Rを起動するために使用するものと一致するように、ファイルパス_/bin/x64/Rgui.exe_を編集する必要があります。この行を_.Rprofile_ファイルに入れるだけで、_restart.R_を入力して呼び出すことができます。 Rコード。

他のメソッドに対するこの欠点は、Shellの場合のように_--no-save_のようなコマンドライン引数を渡すことができないことですが、少なくともこれにより元のRプロセスを終了できます。

4
Matthew

これに対する解決策を探した後、RパッケージRDCOMClientを使用して、この解決策 here に基づいて問題を解決しました。
次のソリューションは、Ctrl + Shift + F10のキー押下をシミュレートすると、RStudio(Windows)内で動作します。

RDCOMClientパッケージは、次のコマンドでインストールする必要があります。

install.packages("RDCOMClient", repos = "http://www.omegahat.net/R")

RStudio(Windows 10)内でキー入力をシミュレートするコードは次のとおりです。

library(RDCOMClient) 
wsh <- COMCreate("Wscript.Shell") 
wsh$SendKeys("^+{F10}") 

上記のコードの最後の行では、「ctrl」キーは「^」で表され、シフトキーは「+」で表されています。この主要な表現の説明はすべて利用可能です こちら

上記のコードの最後の行を実行した直後に、 @ steadyfish のコメントに従って、RStudioのRセッション全体がリセットされます。つまり、現在のセッションからすべてのデータを削除し、セッションでロードされたすべてのパッケージをアンロードします。

4
Eduardo Alvim

別の選択肢として、Emacs ESS(> = 16.10)は、デフォルトでinferior-ess-r-reload-hookにバインドされているC-c C-e C-rを介して下位Rプロセスをリロードできます。

2
ppanko

私は、オプションで現在の作業ディレクトリを設定することにより、Rの最適な使用を実現すると思います。その後、ワークスペース/セッションファイルが表示され始めるか、プロジェクト間で十分な作業を行うたびに、Rを閉じると作業ディレクトリ内のこのデフォルトセッションファイルの名前を変更することができ、R/Rstudioは自動的に新しい現在の作業を妨げることなく、ワークスペース/セッションファイル。

Rを終了し、現在のセッションファイルの名前を変更することを忘れないでください

もちろん、現在の作業を保存したくない場合は、オブジェクトをリセットするか、元のオブジェクトからコピーした後にそれらの操作が行われたかを確認する必要があります。古いワークスペースをいつでもロードできることを知っているのは魅力的ですが、そうでない場合よりも便利です。

簡単にRを終了すると、このワークスペースがいっぱいであることを意味しますが、終了した後に名前を変更し、新しいワークスペースでR/Rstudioを再起動します。新しいワークスペースに選択したオブジェクトをいつでもロードできます。理想的には、すべての重要な作業はプロジェクトディレクトリにあるべきですが、時間をさかのぼるにはジョブの履歴が必要であり、保存されたセッションは、長いプロジェクトに参加するといつか役立つようになります。いずれも必要ない場合は、単にrm(list=ls())

また、@ Eduardo AlvinのRDComClientアイデアは気に入っていますが、廃止されました。

代替オプション

ワークスペース内でいつでも手荷物を取り除くための簡単な代替手段は、save.image

save.image("Rstreamingscience.data")
quit(save='no')
load("Rstreamingscience.data") ##G:/ADA registers##
save.image("Rstreamingscience.data")

これにより、自由に出入りすることができ、必要なだけワークスペースを開くことができます必要です。

1
Suntropical

Windowsでも同じ更新セッション機能が必要でしたが、わずかに修正されたバージョンのコードになりました。

makeActiveBinding("refresh", function() { Shell(paste0("start \"\" \"", R.home(), "/bin/x64/Rgui.exe\"")); q("no") }, .GlobalEnv)

Windowsでは、Rprofile.siteファイルを変更する必要があります。 Rのetcディレクトリの下にあります。また、bin/x64がシステム構成に応じて変更できるパスの最後の部分にも注意してください。これが他の人にも役立つことを願っています。

1
mron
makeActiveBinding("refresh", function() { system(paste0(R.home(),"/bin/i386/R")); q("no") }, .GlobalEnv)

または--saveまたは--no-saveで

paste0(R.home(),"/bin/i386/R --no-save")

これは、refreshを呼び出す前にsetwd()を使用した場合に必要なものだと思います(これも元のバージョンも動作しませんが、Rを再起動してから閉じられるため、新しいウィンドウは開かれません)。これ、そうしてください)

0

.Last();を使用するというMartin Morganの考えに沿ってこれにより、以前に呼び出されたのと同じコマンドラインオプションセットでRが再起動されます。

restart_r <- function(status = 0, debug = TRUE) {
  if (debug) message("restart_r(): Customizing .Last() to relaunch R ...")
  assign(".Last", function() {
    args <- commandArgs()
    system2(args[1], args = args[-1])
  }, envir = globalenv())   
  if (debug) message("restart_r(): Quitting current R session and starting a new one ...")
  quit(save = "no", status = status, runLast = TRUE)
}
0
HenrikB

次の関数を作成しました。覚えて!一度しか使用できません。Rセッションの再起動後にリロードする必要があります。

clc <- function() {
  rm(list = ls(envir = globalenv()),envir = globalenv()) #clear Vars from global enviroment
  gc()  #grabage colector
  cat("\014") #clc
  .rs.restartR() #clear session
}

パッケージを切り離すことも役立つ場合があります。

0