R 내에서 깨끗한 R 세션을 종료하고 다시 시작 하시겠습니까?


88

R 내에서 별칭을 만들어 실행 q()한 다음 깨끗한 R 세션을 다시 시작할 수있는 방법이 있습니까?

그리고 예, 입력하기에는 너무 게으른 q()다음 편지 R:)


작업 공간을 정리할 수는 rm(list=ls())있지만 그게 의미하는 바가 아닙니까?
사샤 Epskamp

2
첨부 한 패키지 및 기타 항목도 분리 하시겠습니까?
Spacedman 2011-06-11

2
한 가지 제안은 작업 공간을 저장하지 않고 R을 다시 시작하는 과 같은에 새 옵션 save매개 변수 를 추가하는 것 입니다. 그런 다음 R을 다시 시작하는 새 함수에 별칭을 할당 할 수 있습니다.q()"r"q("r")
Greg

답변:


78

RStudio를 사용하는 경우 : command / ctrl + shift + F10

당신은 또한 사용할 수 있습니다

.rs.restartR()

12
"깨끗한 R 세션"을 열려면 현재 세션의 1-Data가 제거되어야한다고 생각합니다. 현재 세션의 2- 패키지가 언로드됩니다. .rs.restartR()내 컴퓨터에서 이러한 작업을 수행하지 않는 것 같습니다.
steadyfish

3
.rs.restartR ()은 remove (list = ls ()); 후에도 R이 메모리를 확보하지 못하는 경우에 유용합니다. gc () ;. 이것은 확실히 메모리를 확보합니다. 나는 또한 패키지를 분리하지 않는다는 사실을 좋아합니다.
Richard DiSalvo 2017

56

R을 시작하는 방법에 따라 다음 줄 중 하나를 .Rprofile파일에 배치 하십시오.

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

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

그런 다음 R 콘솔에 입력하십시오.

refresh

현재 세션을 종료하고 새 세션을 시작합니다.


4
또는 .Last <- function() system("R")종료주기의 후반에 reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). 그런 다음 q()계속 돌아옵니다.
Martin Morgan

1
R이 PATH에 있는지 확인하십시오.
G. Grothendieck

2
이 솔루션은 작동하지만 다른 사람이 내 스크립트를 실행하는 경우 재현 할 수 없습니다. R 세션을 다시 시작하기 위해 R 스크립트에 포함시킬 명령이 있습니까? (내가 모든 패키지를 분리하기를 원하는 이유)
Heisenberg

13

.rs.restartR ()이 ctrl + shift + F10을 누르는 것과 유사하게 작동한다는 것을 알았습니다. 그러나 패키지를 언로드하지 마십시오


RStudio에서 작동하지만 다른 곳에서 작동하도록하는 방법이 있는지 잘 모르겠습니다. getAnywhere(".rs.restartR")그것 에서 인 것 같습니다 tools:rstudio. 순수한 R 세션에서 액세스 할 운이 없었습니다.
Gregor Thomas

11
.rs.restartR()패키지를 언로드하지 않으므로 정확히 동일 하지 않습니다ctrl+shift+f10
Arthur

5

또 다른 대안으로 Emacs ESS (> = 16.10)는 기본적으로 inferior-ess-r-reload-hook바인딩 된 열등한 R 프로세스를 다시로드 할 수 있습니다 C-c C-e C-r.


공장! 훌륭하게!
agent18

4

이전 게시물이지만 답변이 제대로 작동하지 않으므로 (저는 Windows를 사용하고 다른 사용자를 테스트하지 않았습니다) 솔루션을 추가하겠습니다. 내 용어 중 일부는 여기에서 벗어날 수 있지만 요점은 다음과 같습니다.

위의 답변은 제대로 작동하지 않습니다.

여기에 제출 된 대부분의 답변 은 새 R 콘솔을 열고 원래 콘솔을 닫도록 지시하는 동안 새 콘솔이 이전 콘솔의 애플리케이션 컨텍스트에서 실행되는 프로세스이기 때문에 shell또는 사용 system과 관련이 있습니다. 즉, 새 콘솔이 닫힐 때까지 원래 콘솔을 닫을 수 없습니다. hedgedandlevered와 같은 위의 일부 사용자는 원래 콘솔을 닫으면 새 콘솔이 강제로 닫힙니다. 시도하면 새 콘솔이 열리지 만 새 콘솔이 닫힐 때까지 이전 콘솔은 고정 된 상태로 열려 있습니다.

기본 문제는 원래 콘솔에서 새 콘솔로 응용 프로그램 컨텍스트를 호출 shell하거나 system변경하지 않으므로 새 콘솔이 닫힐 때까지 원래 프로세스를 종료 할 수 없습니다.

나를 위해 일하는 대안

대신 shell.exec파일 유형에 따라 기본 응용 프로그램에서 파일을 여는 데 일반적으로 사용되는 것을 사용하십시오. .exe에서 사용하면 분명히 실행 파일을 실행합니다. 그러나 중요한 차이점은 시스템이 별도의 컨텍스트에서 응용 프로그램을 시작한다는 것입니다. 그래서 여기 저에게 맞는 코드가 있습니다.

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

/bin/x64/Rgui.exeR을 시작하는 데 사용하는 것과 일치 하도록 파일 경로를 편집해야합니다. 이 줄을 .Rprofile파일에 넣은 다음 restart.RR 코드를 입력하여 호출 할 수 있습니다 .

다른 방법에 비해이 방법의 단점은 --no-save그냥 에서처럼 명령 줄 인수를 전달할 수 없다는 것입니다 shell. 그러나 최소한 이렇게하면 원래 R 프로세스를 닫을 수 있습니다.


4

이에 대한 솔루션을 찾고 후, 나는 내 문제는이 솔루션을 기반으로 해결 여기 는 R 패키지 사용 RDCOMClient을 .
아래 솔루션은 키 누름 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'키는 '^'로 표시되고 Shift 키는 '+'로 표시됩니다. 이 주요 표현에 대한 모든 설명은 여기에서 확인할 수 있습니다. .

위 코드의 마지막 줄을 실행 한 직후 @steadyfish 의 의견 에 따라 RStudio의 전체 R 세션이 재설정됩니다 . 즉, 현재 세션에서 모든 데이터를 제거하고 세션에서로드 된 모든 패키지를 언로드합니다.


2

이 함수를 .Rprofile에 작성하십시오.

r <- function() {
  assign('.Last',  function() {system('R')}, envir = globalenv())
  quit(save = 'no')
}

r()R 세션을 다시 시작합니다. 로드 된 패키지는 다시로드되지 않습니다. 환경이 저장되지 않습니다.

Linux에서 작동합니다. 다른 OS에서 어떤 일이 발생할지 전혀 모릅니다.


1

Windows에서 동일한 새로 고침 세션 기능이 필요했고 코드의 약간 수정 된 버전으로 끝났습니다.

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

Windows에서는 Rprofile.site파일 을 수정해야 합니다. R의 etc디렉토리에 있습니다. 또한 bin/x64시스템 구성에 따라 변경 될 수 있는 경로의 마지막 부분 을주의하십시오. 나는 이것이 다른 사람들에게도 도움이되기를 바랍니다.


1

Martin Morgan의 사용 아이디어와 일치합니다 .Last(). 이렇게하면 이전에 호출 된 것과 동일한 명령 줄 옵션 집합으로 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)
}

2
참고로, 내가 추가 한 startup::restart()받는 시작 다시 시작 R.의 convenint의 방법으로 패키지
HenrikB

1

나는 옵션에서 현재 작업 디렉토리를 설정함으로써 R의 최상의 사용을 실현한다고 생각합니다. 그런 다음 작업 공간 / 세션 파일이 표시되기 시작하거나 프로젝트 사이에 충분한 작업이있을 때마다 R을 닫은 후 작업 디렉토리에서이 기본 세션 파일의 이름을 바꿀 수 있으며 R / Rstudio는 자동으로 새 파일에서 시작합니다. 현재 작업을 방해하지 않고 작업 영역 / 세션 파일.

R을 종료하고 현재 세션 파일의 이름을 변경해야합니다.

물론 현재 작업을 저장하지 않으려면 원래 개체에서 복사 한 후에 개체를 재설정하거나 작업을 수행했는지 확인해야합니다. 항상 이전 작업 공간을로드 할 수 있다는 것을 아는 것은 유혹이지만 그렇지 않은 것보다 더 유용합니다.

간단히 R을 종료하면이 작업 공간이 꽉 찼다는 의미이며, 종료를 완료 한 후 이름을 바꾸고 새 작업 공간으로 R / Rstudio를 다시 시작하는 동안 약간의 간격이 있습니다. 항상 새 작업 공간에서 선택한 개체를로드 할 수 있습니다. 이상적으로는 모든 중요한 작업이 프로젝트 디렉토리에 있어야하지만 작업 기록이 필요할 때마다 돌아 가야하며 저장된 세션은 더 긴 프로젝트를 수행하면 어느 시점에서 유용하게 사용됩니다. 필요하지 않다면rm(list=ls())

또한 나는 RDComClient @Eduardo Alvin 아이디어가 마음에 들지만 중단되었습니다.

대체 옵션

작업 공간 내에서 언제든지 수하물을 제거하는 간단한 대안은 다음을 사용하는 것입니다. save.image

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

이렇게하면 원하는대로 자유롭게오고 갈 수 있으며 필요한 만큼 작업 공간을 열 수 있습니다.


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

또는 --save 또는 --no-save

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

나는 이것이 당신이 새로 고침을 호출하기 전에 setwd ()를 사용했다면 필요한 것이라고 생각한다. 이렇게 해주세요)


시도하면 새 창이 열리지 만 새 창이 닫힐 때까지 이전 창이 고정 된 상태로 열려 있습니다.
Matthew

0

다음 기능을 작성했습니다. 생각해 내다! 한 번만 사용할 수 있으며 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
}

때로는 패키지를 분리하는 것도 도움이됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.