Salga y reinicie una sesión R limpia desde dentro de R?

¿Hay alguna manera de hacer un alias dentro de R que ejecute q() y reiniciar una sesión R limpia?

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

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

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

Luego, ingresando esto en la consola R:

 refresh 

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

Si estás en RStudio: command / ctrl + shift + F10

También puedes usar

 .rs.restartR() 

Encontré que .rs.restartR () funciona igual que presionar ctrl + shift + F10.

Publicación anterior, pero ninguna de las respuestas funciona (para mí, estoy usando Windows, no he probado otras), así que agregaré mi solución. Parte de mi terminología podría estar fuera de aquí, pero esto debería aclarar el punto:

Las respuestas anteriores no funcionan del todo

La mayoría de las respuestas presentadas aquí implican usar shell o system que no funciona porque mientras abren una nueva consola R y le indican a la consola original 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 puede cerrarse hasta que se cierre la nueva consola. Algunos de los usuarios anteriores, como hedgedandlevered, informaron que el cierre de la consola original obliga a cerrar la nueva consola. Cuando lo bash, la nueva consola se abre, pero la consola anterior permanece abierta en estado congelado hasta que se cierra la nueva consola.

El problema básico es llamar a shell o el system no cambia el contexto de la aplicación de la consola original a la nueva, y por lo tanto, el proceso original no puede finalizar hasta que la nueva consola se cierre.

Alternativa que me funciona

En su lugar, use shell.exec que 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. La diferencia importante, sin embargo, es que el sistema inicia la aplicación en su propio contexto separado. Así que aquí está el código que funciona para mí:

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

Tendrá que editar la ruta del archivo /bin/x64/Rgui.exe para que coincida con lo que use para iniciar R. Simplemente ponga esta línea en su archivo .Rprofile , luego puede llamarlo al ingresar a restart.R en su R código.

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

Necesitaba la misma funcionalidad de actualización de sesió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 necesita modificar el archivo Rprofile.site . Está bajo el directorio de R’s etc También tenga cuidado con la última parte de la ruta que bin/x64 puede cambiar de acuerdo con la configuración de su sistema. Espero que esto ayude a otros también.

Después de buscar una solución para esto, resolví mi problema basado en esta solución aquí , usando el paquete RDCOMClient .
La solución abajo funciona en RStudio (Windows), una vez que simula las pulsaciones de tecla 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) son:

 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 Mayús por '+'. Todas las explicaciones para estas representaciones clave están disponibles aquí .

Justo después de ejecutar la última línea del código anterior, se reiniciará toda la sesión 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.

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

o con –save or –no-save

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

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

He escrito la siguiente función. ¡Recuerda! Solo puede usarlo una vez, luego debe volver a cargarlo después de que la sesión R se reinicie.

 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.

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 que anteriormente se llamaba:

 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) }