Вийти та перезапустити чистий сеанс R ізсередини R?


88

Чи можу я зробити псевдонім у межах R, який буде виконуватись, q()а потім перезапустити чистий R-сеанс?

І так, мені лінь друкувати, q()а потім лист R:)


Ну, ви можете очистити робочу область, rm(list=ls())але це не те, що ви маєте на увазі?
Саша Епскамп,

2
Ви також хочете від'єднати будь-які пакунки та інші речі, які ви могли долучити?
Spacedman

2
Можливо, однією з пропозицій було б додати новий параметр saveпараметра q(), наприклад "r", який перезапускає R без збереження робочої області. Тоді псевдонім для q("r")може бути призначений новій функції, яка перезапускає R.
Грег,

Відповіді:


78

Якщо ви перебуваєте в RStudio: command / ctrl + shift + F10

Ви також можете використовувати

.rs.restartR()

12
Я вважаю, що для відкриття "чистого R-сеансу" потрібно видалити 1-дані з поточного сеансу; 2-пакети з поточного сеансу завантажуються. .rs.restartR()здається, не робить нічого з цього на моїй машині ..
steadyfish

3
Я вважаю .rs.restartR () корисним для випадків, коли R не звільняє пам'ять навіть після видалення (list = ls ()); gc ();. Це, безумовно, звільняє пам’ять. Мені також подобається той факт, що він не від'єднує пакунки.
Річард ДіСалво,

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 знаходиться на вашому шляху.
Г. Гротендік,

2
Це рішення працює, але не відтворюється, коли моїм сценарієм керують інші. Чи існує команда, яка повинна бути включена в сценарій R для перезапуску сеансу R? (причина в тому, що я хочу, щоб усі пакунки були від'єднані)
Гайзенберг,

13

Я виявив, що .rs.restartR () працює подібно до натискання ctrl + shift + F10. але не розвантажувати упаковки


Працює в RStudio - але я не впевнений, що є спосіб зробити так, щоб це працювало деінде. З getAnywhere(".rs.restartR")нього виявляється в tools:rstudio. Мені не пощастило отримати доступ до цього на чистому R-сеансі.
Грегор Томас

11
.rs.restartR()не розвантажує пакунки, тож це не зовсім те саме, щоctrl+shift+f10
Артур

5

Як інша альтернатива, Emacs ESS (> = 16,10) може перезавантажити нижчий R-процес, через inferior-ess-r-reload-hookякий C-c C-e C-rза замовчуванням пов'язаний.


Працює! блискуче!
agent18

4

Стара публікація, але жодна з відповідей не працює (для мене я використовую 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)

Вам потрібно буде відредагувати шлях /bin/x64/Rgui.exeдо файлу так, щоб він відповідав усім, що ви використовували для запуску R. Ви просто вклали цей рядок у свій .Rprofileфайл, після чого можете викликати його, ввівши restart.Rсвій код R

Недоліком цього в порівнянні з іншими методами є те, що ви не можете передавати аргументи командного рядка так, --no-saveяк це було б з shell, але, принаймні, це дозволить вам закрити початковий процес R.


4

Після пошуку рішення, я вирішив свою проблему на основі цього рішення тут , використовуючи R-пакет RDCOMClient .
Наведене нижче рішення просто працює в RStudio (Windows), як тільки воно імітує натискання клавіш ctrl + shift + F10 .

Пакет RDCOMClient повинен бути встановлений за допомогою наведеної нижче команди:

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

Код для імітації натискань клавіш у RStudio (Windows 10):

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

В останньому рядку наведеного вище коду клавіша 'ctrl' представлена ​​символом '^', а клавіша Shift - '+'. Всі пояснення цього ключового уявлення доступні тут .

Одразу після запуску останнього рядка коду вище, вся сесія R у RStudio буде скинута, згідно з коментарем @steadyfish . Тобто він видаляє всі дані з поточного сеансу та вивантажує всі завантажені пакети в сеансі.


2

Запишіть цю функцію у свій .Rprofile

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

r()перезапускає ваш сеанс R. Завантажені пакунки не перезавантажуватимуться. Ваше середовище не буде збережено.

Працює для Linux. Поняття не маю, що може статися в інших ОС


1

Мені потрібна була та сама функціональність сеансу оновлення у Windows, і в підсумку я отримав трохи змінену версію коду:

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

У вікнах вам потрібно змінити Rprofile.siteфайл. Він знаходиться в etcкаталозі R. Також слідкуйте за останньою частиною шляху, який bin/x64може змінитися відповідно до конфігурації вашої системи. Сподіваюся, це допоможе і іншим.


1

Відповідно до ідеї Мартіна Моргана щодо використання .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
FYI, я додав startup::restart()до стартового пакету як
звичайний

1

Я думаю, хтось реалізує найкраще використання R, встановивши поточний робочий каталог у параметрах. Потім, коли ваша робоча область / файл сеансу починає відображати вас або містить у вас достатньо вашої роботи (між проектами), ви можете просто перейменувати цей файл сеансу за замовчуванням у робочий каталог після закриття R і R / Rstudio автоматично запускатиме вас у новому файл робочої області / сеансу, не заважаючи поточній роботі.

Не забудьте залишити R та перейменувати поточний файл сеансу

Звичайно, якщо ви не хочете зберігати поточну роботу, вам слід переконатись, що ви скидаєте об'єкти або операції над ними виконувались після копіювання з оригінальних об'єктів, щоб вони були як є. Повірте мені, знаючи, що ви завжди можете завантажити старі робочі області - це спокуса, але корисніше, ніж ні.

Коротше кажучи quit 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 () перед викликом оновлення (хоча ні ця, ні оригінальна версія для мене не працюють, оскільки вона перезапускає R, а потім закривається, нове вікно ніколи не відкривається. Якщо хтось може прокоментувати це, будь ласка, зробіть це)


коли я спробую це, відкривається нове вікно, але старе вікно залишається відкритим у замороженому стані, поки нове вікно не буде закрито
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
}

Іноді також допомагає від’єднання пакета.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.