¿Salir y reiniciar una sesión limpia de R desde dentro de R?

88

¿Hay alguna manera de que pueda crear un alias, dentro de R, que se ejecute q()y luego reinicie una sesión de R limpia?

Y sí, soy demasiado vago para escribir q()y luego la letra R:)

justin
fuente
Bueno, puedes limpiar tu espacio de trabajo con rm(list=ls())pero eso no es lo que quieres decir, ¿verdad?
Sacha Epskamp
2
¿También desea separar los paquetes y otras cosas que pueda haber adjuntado?
Spacedman
2
Quizás una sugerencia sería agregar un nuevo saveparámetro de opción q(), por ejemplo "r", que reinicia R sin guardar el espacio de trabajo. A continuación, un alias para q("r")podría ser asignado a una nueva función que se reinicia R.
Greg

Respuestas:

78

Si está en RStudio: comando / ctrl + shift + F10

También puedes usar

.rs.restartR()
mgoldwasser
fuente
12
Creo que abrir una "sesión limpia de R" requiere que se eliminen los datos 1 de la sesión actual; 2-Se descargan los paquetes de la sesión actual. .rs.restartR()no parece hacer ninguna de estas cosas en mi máquina ..
Steadyfish
3
Encuentro el .rs.restartR () útil para los casos en que R no liberaría memoria incluso después de eliminar (list = ls ()); gc () ;. Esto definitivamente libera la memoria. También me gusta el hecho de que no separa paquetes.
Richard DiSalvo
56

Dependiendo de cómo inicie R, intente colocar una de estas líneas en su .Rprofilearchivo:

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

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

Luego ingrese esto en la consola R:

refresh

cerrará la sesión actual y comenzará una nueva.

G. Grothendieck
fuente
4
o .Last <- function() system("R")incluso más tarde en el ciclo de apagado reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE). Luego q()sigue volviendo.
Martin Morgan
1
Asegúrese de que R esté en su RUTA.
G. Grothendieck
2
Esta solución funciona pero no es reproducible cuando otros ejecutan mi script. ¿Se debe incluir un comando en el script R para reiniciar la sesión R? (la razón es que quiero todos los paquetes se separen)
Heisenberg
13

Encontré que .rs.restartR () funciona de manera similar a presionar ctrl + shift + F10. pero dosificar no descargar los paquetes

Adam Lee Perelman
fuente
Funciona en RStudio, pero no estoy seguro de que haya una forma de hacerlo funcionar en otro lugar. Desde getAnywhere(".rs.restartR")parece estar en tools:rstudio. No he tenido suerte accediendo a eso en una sesión pura de R.
Gregor Thomas
11
.rs.restartR()no descarga los paquetes, por lo que no es exactamente lo mismo quectrl+shift+f10
Arthur
5

Como otra alternativa, Emacs ESS (> = 16.10) puede recargar el proceso R inferior a través del inferior-ess-r-reload-hookcual está vinculado C-c C-e C-rpor defecto.

ppanko
fuente
¡Trabajos! brillantemente!
agent18
4

Publicación anterior, pero ninguna de las respuestas funciona (para mí, estoy usando Windows, no he probado otras), así que agregaré mi solución. Es posible que parte de mi terminología no esté aquí, pero esto debería transmitir el punto:

Las respuestas anteriores no funcionan del todo

La mayoría de las respuestas enviadas aquí implican el uso de shello systemque no funciona del todo porque mientras abren una nueva consola R y le dan instrucciones a la consola original para que se cierre, la nueva consola es un proceso que se ejecuta en el contexto de la aplicación de la consola anterior. Eso significa que la consola original no se puede cerrar hasta que se cierre la nueva consola. Algunos de los usuarios anteriores, como hedgedandlevered, informaron que cerrar la consola original obliga a cerrar la nueva consola. Cuando lo intento, la nueva consola se abre, pero la consola anterior permanece abierta en un estado congelado hasta que se cierra la nueva.

El problema básico es llamar shello systemno cambia el contexto de la aplicación de la consola original a la nueva y, por lo tanto, el proceso original no puede terminar hasta que se cierra la nueva consola.

Alternativa que me funciona

En su lugar, use el shell.execque normalmente se usaría para abrir un archivo en la aplicación predeterminada según el tipo de archivo. Cuando se usa en un .exe, aparentemente, ejecuta el ejecutable. Sin embargo, la diferencia importante es que el sistema inicia la aplicación en su propio contexto separado. Así que aquí está el código que me funciona:

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

Deberá editar la ruta del archivo /bin/x64/Rgui.exepara que coincida con lo que use para iniciar R. Simplemente coloque esta línea en su .Rprofilearchivo, luego puede llamarlo ingresando restart.Rsu código R.

La desventaja de esto con respecto a otros métodos es que no puede pasar argumentos de línea de comando --no-savecomo lo haría con solo shell, pero al menos esto le permitirá cerrar el proceso R original.

Mateo
fuente
4

Después de buscar una solución a esto, resolví mi problema basándome en esta solución aquí , usando el R Package RDCOMClient .
La siguiente solución solo funciona dentro de RStudio (Windows), una vez que simula la pulsación de teclas ctrl + shift + F10 .

El paquete RDCOMClient debe instalarse con el siguiente comando:

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

El código para simular las pulsaciones de teclas dentro de RStudio (Windows 10) es:

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

En la última línea del código anterior, la tecla 'ctrl' está representada por '^' y la tecla de mayúsculas por '+'. Todas las explicaciones de estas representaciones clave están disponibles aquí .

Justo después de ejecutar la última línea del código anterior, se restablecerá toda la sesión de R en RStudio, según el comentario de @steadyfish . Es decir, elimina todos los datos de la sesión actual y descarga todos los paquetes cargados en la sesión.

Eduardo Alvim
fuente
2

Escriba esta función en su .Rprofile

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

r()reinicia su sesión R. Los paquetes cargados no se recargan. Su entorno no se salvará.

Funciona para Linux. No tengo idea de lo que puede suceder en otros sistemas operativos

Andrea
fuente
1

Necesitaba la misma funcionalidad de sesión de actualización en Windows y terminé con una versión ligeramente modificada del código:

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

En Windows es necesario modificar el Rprofile.sitearchivo. Está en el etcdirectorio de R. También tenga cuidado con la última parte de la ruta que bin/x64puede cambiar de acuerdo con la configuración de su sistema. Espero que esto también ayude a otros.

mron
fuente
1

De acuerdo con la idea de Martin Morgan de usar .Last(); esto reinicia R con el mismo conjunto de opciones de línea de comandos como se llamó anteriormente:

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
fuente
2
Para su información, he añadido startup::restart()a la puesta en marcha del paquete como una forma convenint de R. reinicio
HenrikB
1

Creo que uno se da cuenta del mejor uso de R configurando un directorio de trabajo actual en opciones. Luego, cada vez que su espacio de trabajo / archivo de sesión comience a aparecer o tenga suficiente de su trabajo en él (entre proyectos), puede simplemente cambiar el nombre de este archivo de sesión predeterminado en el directorio de trabajo después de cerrar R y R / Rstudio lo iniciará automáticamente en un nuevo espacio de trabajo / archivo de sesión, sin perturbar su trabajo actual.

Recuerde salir de R y cambiar el nombre del archivo de sesión actual

Por supuesto, si no desea guardar el trabajo actual, debe asegurarse de restablecer los objetos o las operaciones en ellos se realizaron después de copiar de los objetos originales para que estén como están. Créame, saber que siempre puede cargar los espacios de trabajo antiguos es una tentación, pero es más útil que no.

En resumen, salir de R, le da un espacio al salir, significa que este espacio de trabajo está lleno, cámbiele el nombre después de completar el cierre y reinicie R / Rstudio con un espacio de trabajo nuevo. Siempre puede cargar objetos seleccionados en el nuevo espacio de trabajo. Idealmente, todo el trabajo importante debe estar en los directorios de proyectos, pero aún necesita un historial de sus trabajos para volver a él en ocasiones y las sesiones guardadas son útiles en algún momento una vez que se encuentra en proyectos más largos. Si no necesitas nada de eso, solorm(list=ls())

Además, me gusta la RDComClientidea de @Eduardo Alvin pero ha sido descatalogada.

OPCIÓN ALTERNATIVA

Una alternativa sencilla para deshacerse del equipaje en cualquier momento dentro de su espacio de trabajo es utilizar save.image

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

Esto le permite entrar y salir cuando quiera y abrir tantos espacios de trabajo como necesite.

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

o con --save o --no-save

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

Creo que esto es lo que necesita si ha usado setwd () antes de llamar a refresh (aunque ni esta ni la versión original funcionan para mí, ya que reinicia R y luego se cierra, nunca se abre una nueva ventana. Si alguien puede comentar sobre esto, por favor hazlo)

cubierto de setos
fuente
cuando intento esto, se abre una nueva ventana, pero la ventana anterior se mantiene abierta en un estado congelado hasta que se cierra la nueva ventana
Mateo
0

He escrito la siguiente función. ¡Recuerda! Solo puede usarlo una vez, luego debe volver a cargarlo después de que se reinicie la sesión de 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
}

A veces, separar un paquete también ayuda.

Adam Lee Perelman
fuente