Выйти и перезапустить чистый сеанс R из R?

88

Есть ли способ создать в R псевдоним, который будет запускать, q()а затем перезапускать чистый сеанс R?

И да, мне лень печатать q()а потом букву R:)

Джастин
источник
Ну, вы можете очистить свое рабочее пространство, rm(list=ls())но вы не это имеете в виду, верно?
Sacha Epskamp
2
Вы также хотите отсоединить какие-либо пакеты и другие вещи, которые вы могли прикрепить?
Spacedman
2
Возможно, одним из предложений было бы добавить новый saveпараметр option q(), например "r", который перезапускает R без сохранения рабочей области. Тогда псевдоним для q("r")можно было бы назначить новой функции, которая перезапускает R.
Грег

Ответы:

78

Если вы в RStudio: command / ctrl + shift + F10

Вы также можете использовать

.rs.restartR()
Мольдвассер
источник
12
Я считаю, что для открытия «чистого сеанса R» необходимо удалить 1-данные из текущего сеанса; 2-Пакеты из текущего сеанса выгружаются. .rs.restartR()похоже, что ни то, ни другое не выполняет на моей машине ..
stablefish
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()продолжает возвращаться.
Мартин Морган
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 Package 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 - знаком «+». Все объяснения этих ключевых представлений доступны здесь .

Согласно комментарию @steadyfish, сразу после запуска последней строки приведенного выше кода весь сеанс R в RStudio будет сброшен . То есть он удаляет все данные из текущего сеанса и выгружает все загруженные пакеты в сеансе.

Эдуардо Альвим
источник
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)

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

mron
источник
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)
}
HenrikB
источник
2
К вашему сведению, я добавил startup::restart()в стартовый пакет как
удобный
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")

Это дает вам возможность приходить и уходить, когда вам угодно, и открывать столько рабочих мест, сколько вам нужно.

Suntropical
источник
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, а затем закрывается, новое окно никогда не открывается. Если кто-то может прокомментировать это, пожалуйста, сделайте это)

огражденный
источник
когда я пытаюсь это сделать, открывается новое окно, но старое окно остается открытым в замороженном состоянии, пока новое окно не будет закрыто
Мэтью
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
}

Иногда также помогает отсоединение пакета.

Адам Ли Перельман
источник