Saia e reinicie uma sessão R limpa de dentro de R?

88

Existe uma maneira de fazer um alias, dentro de R, que irá executar q()e reiniciar uma sessão R limpa?

E sim, estou com preguiça de digitar q()e depois a letra R:)

justin
fonte
Bem, você pode limpar seu espaço de trabalho com, rm(list=ls())mas não é isso que você quer dizer, certo?
Sacha Epskamp
2
Você também deseja remover quaisquer pacotes e outras coisas que possa ter anexado?
Spacedman
2
Talvez uma sugestão seja adicionar um novo saveparâmetro de opção q(), como "r"reiniciar o R ​​sem salvar o espaço de trabalho. Em seguida, um alias para q("r")pode ser atribuído a uma nova função que reinicia R.
Greg

Respostas:

78

Se você estiver no RStudio: command / ctrl + shift + F10

Você também pode usar

.rs.restartR()
mgoldwasser
fonte
12
Acredito que abrir uma "sessão R limpa" requer que 1-Dados da sessão atual sejam removidos; 2-Pacotes da sessão atual são descarregados. .rs.restartR()não parece fazer nenhuma dessas coisas na minha máquina ..
stablefish
3
Eu acho o .rs.restartR () útil para casos em que R não liberaria memória mesmo após remover (list = ls ()); gc () ;. Isso definitivamente libera a memória. Também gosto do fato de não separar pacotes.
Richard DiSalvo de
56

Dependendo de como você inicia o R, tente colocar uma destas linhas em seu .Rprofilearquivo:

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

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

Em seguida, insira isso no console R:

refresh

encerrará a sessão atual e iniciará uma nova.

G. Grothendieck
fonte
4
ou .Last <- function() system("R")ou mesmo mais tarde no ciclo de desligamento reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). Então q()continua voltando.
Martin Morgan
1
Certifique-se de que R está em seu PATH.
G. Grothendieck,
2
Esta solução funciona, mas não é reproduzível quando meu script é executado por outras pessoas. Existe um comando a ser incluído no script R para reiniciar a sessão R? (a razão é que eu quero que todos os pacotes sejam retirados)
Heisenberg
13

Descobri que .rs.restartR () funciona de maneira semelhante a pressionar ctrl + shift + F10. mas não descarregue os pacotes

Adam Lee Perelman
fonte
Funciona no RStudio - mas não tenho certeza se há uma maneira de fazê-lo funcionar em qualquer outro lugar. De getAnywhere(".rs.restartR")parece estar em tools:rstudio. Não tive sorte ao acessar isso em uma sessão R pura.
Gregor Thomas
11
.rs.restartR()não descarrega os pacotes, portanto, não é exatamente o mesmo quectrl+shift+f10
Arthur
5

Como outra alternativa, o Emacs ESS (> = 16.10) pode recarregar o processo R inferior por meio do inferior-ess-r-reload-hookqual é vinculado C-c C-e C-rpor padrão.

ppanko
fonte
Trabalho! brilhantemente!
agente 18 de
4

Postagem antiga, mas nenhuma das respostas funciona (para mim, estou usando Windows, não testei outros), então adicionarei minha solução. Algumas das minhas terminologias podem estar erradas aqui, mas isso deve esclarecer o ponto:

As respostas acima não funcionam bem

A maioria das respostas enviadas aqui envolve o uso de shellou o systemque não funciona muito bem porque, embora eles abram um novo console R e instruam o console original a fechar, o novo console é um processo em execução no contexto do aplicativo do console antigo. Isso significa que o console original não pode ser fechado até que o novo console seja fechado. Alguns dos usuários acima, como hedgedandlevered, relataram que o fechamento do console original força o fechamento do novo console. Quando tento, o novo console abre, mas o antigo permanece aberto em um estado congelado até que o novo console seja fechado.

O problema básico é chamar shellou systemnão alterar o contexto do aplicativo do console original para o novo e, portanto, o processo original não pode terminar até que o novo console seja fechado.

Alternativa que funciona para mim

Em vez disso, use o shell.execque normalmente seria usado para abrir um arquivo no aplicativo padrão com base no tipo de arquivo. Quando usado em um .exe, aparentemente, ele executa o executável. A diferença importante, porém, é que o sistema inicia o aplicativo em seu próprio contexto separado. Então, aqui está o código que funciona para mim:

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

Você precisará editar o caminho do arquivo /bin/x64/Rgui.exepara corresponder ao que usar para iniciar R. Basta colocar esta linha em seu .Rprofilearquivo e, em seguida, chamá-la inserindo restart.Rseu código R.

A desvantagem disso em relação a outros métodos é que você não pode passar argumentos de linha de comando --no-savecomo faria com apenas shell, mas pelo menos isso permitirá que você feche o processo R original.

Mateus
fonte
4

Depois de procurar uma solução para isso, resolvi meu problema com base nesta solução aqui , usando o Pacote R RDCOMClient .
A solução abaixo funciona apenas dentro do RStudio (Windows), uma vez que simula os pressionamentos de teclas ctrl + shift + F10 .

O pacote RDCOMClient deve ser instalado com o comando abaixo:

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

O código para simular os pressionamentos de tecla no RStudio (Windows 10) são:

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

Na última linha do código acima, a tecla 'ctrl' é representada por '^' e a tecla shift por '+'. Todas as explicações para essas representações chave estão disponíveis aqui .

Logo após executar a última linha do código acima, toda a sessão R no RStudio será reiniciada, de acordo com o comentário de @steadyfish . Ou seja, ele remove todos os dados da sessão atual e descarrega todos os pacotes carregados na sessão.

Eduardo alvim
fonte
2

Escreva esta função em seu .Rprofile

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

r()reinicia sua sessão R. Os pacotes carregados não recarregam. Seu ambiente não será salvo.

Funciona para Linux. Não faço ideia do que pode acontecer em outro sistema operacional

Andrea
fonte
1

Eu precisava da mesma funcionalidade de atualização da sessão no Windows e acabei com uma versão ligeiramente modificada do código:

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

No Windows, você precisa modificar o Rprofile.sitearquivo. Ele está no etcdiretório de R. Observe também a última parte do caminho que bin/x64pode ser alterado de acordo com a configuração do sistema. Espero que isso ajude outras pessoas também.

mron
fonte
1

Em linha com a ideia de uso de Martin Morgan .Last(); isso reinicia o R com o mesmo conjunto de opções de linha de comando anteriormente chamado:

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)
}
HenrikB
fonte
2
Para sua informação, adicionei startup::restart()ao pacote de inicialização como uma forma
conveniente
1

Acho que se percebe o melhor uso de R definindo um diretório de trabalho atual em opções. Então, sempre que o seu espaço de trabalho / arquivo de sessão começar a aparecer ou tiver trabalho suficiente nele (entre projetos), você pode simplesmente renomear este arquivo de sessão padrão no diretório de trabalho após fechar R e R / Rstudio irá automaticamente iniciar você em um novo arquivo de espaço de trabalho / sessão, sem atrapalhar seu trabalho atual.

Lembre-se de sair do R e renomear o arquivo da sessão atual

Obviamente, se você não quiser salvar o trabalho atual, certifique-se de redefinir os objetos ou as operações sobre eles foram feitas após a cópia dos objetos originais para que fiquem como estão. Acredite em mim, saber que você sempre pode carregar os espaços de trabalho antigos é uma tentação, mas é mais útil do que não.

Resumindo, saia do R, isso lhe dá alguma lacuna, enquanto o encerramento significa que este espaço de trabalho está cheio, renomeie-o após concluir o encerramento e reinicie o R / Rstudio com um novo espaço de trabalho. Você sempre pode carregar objetos selecionados no novo espaço de trabalho. Idealmente, todos os trabalhos importantes devem estar nos diretórios do projeto, mas você ainda precisa de um histórico de seus trabalhos para voltar às vezes e as sessões salvas podem ser úteis em algum ponto quando você estiver em projetos mais longos. Se você não precisa de nada disso, apenasrm(list=ls())

Além disso, gosto da RDComClientideia de @Eduardo Alvin mas foi descontinuada.

OPÇÃO ALTERNATIVA

Uma alternativa simples para se livrar da bagagem a qualquer momento dentro de sua área de trabalho é usar save.image

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

Isso o deixa livre para entrar e sair quando quiser e abrir quantos espaços de trabalho você precisar.

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

ou com --save ou --no-save

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

Acho que é disso que você precisa se tiver usado setwd () antes de chamar o refresh (embora nem isso nem a versão original funcionem para mim, já que ele reinicia o R e se fecha, uma nova janela nunca é aberta. Se alguém puder comentar sobre isso, por favor, faça isso)

cercado e alavancado
fonte
quando tento fazer isso, uma nova janela é aberta, mas a janela antiga é mantida aberta em um estado congelado até que a nova janela seja fechada
Mateus
0

Eu escrevi a seguinte função. Lembrar! Você só pode usá-lo uma vez, então você deve recarregá-lo depois que a sessão R for reiniciada.

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

Às vezes, retirar um pacote também ajuda.

Adam Lee Perelman
fonte