Есть ли способ создать в R псевдоним, который будет запускать, q()
а затем перезапускать чистый сеанс R?
И да, мне лень печатать q()
а потом букву R
:)
Есть ли способ создать в R псевдоним, который будет запускать, q()
а затем перезапускать чистый сеанс R?
И да, мне лень печатать q()
а потом букву R
:)
save
параметр option q()
, например "r"
, который перезапускает R без сохранения рабочей области. Тогда псевдоним для q("r")
можно было бы назначить новой функции, которая перезапускает R.
Ответы:
Если вы в RStudio: command / ctrl + shift + F10
Вы также можете использовать
.rs.restartR()
.rs.restartR()
похоже, что ни то, ни другое не выполняет на моей машине ..
В зависимости от того, как вы запускаете R, попробуйте поместить в .Rprofile
файл одну из этих строк :
makeActiveBinding("refresh", function() { shell("Rgui"); q("no") }, .GlobalEnv)
makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)
Затем введите это в консоль R:
refresh
завершит текущий сеанс и запустит новый.
.Last <- function() system("R")
даже позже в цикле выключения reg.finalizer(.GlobalEnv, function(e) system("R"), TRUE)
. Потом q()
продолжает возвращаться.
Я обнаружил, что .rs.restartR () работает аналогично нажатию ctrl + shift + F10. но доза не выгружать пакеты
getAnywhere(".rs.restartR")
него вроде бы в tools:rstudio
. Мне не удалось получить доступ к этому в сеансе чистого R.
.rs.restartR()
не выгружает пакеты, поэтому это не совсем то же самое, чтоctrl+shift+f10
Старый пост, но ни один из ответов не работает (для меня я использую 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.
После поиска решения этой проблемы я решил свою проблему на основе этого решения здесь , используя 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 будет сброшен . То есть он удаляет все данные из текущего сеанса и выгружает все загруженные пакеты в сеансе.
Запишите эту функцию в свой .Rprofile
r <- function() {
assign('.Last', function() {system('R')}, envir = globalenv())
quit(save = 'no')
}
r()
перезапускает ваш R-сеанс. Загруженные пакеты не перезагружаются. Ваше окружение не будет спасено.
Работает под Linux. Не знаю, что может случиться с другой ОС
Мне нужна была такая же функциональность сеанса обновления в Windows, и я получил слегка измененную версию кода:
makeActiveBinding("refresh", function() { shell(paste0("start \"\" \"", R.home(), "/bin/x64/Rgui.exe\"")); q("no") }, .GlobalEnv)
В Windows вам нужно изменить Rprofile.site
файл. Он находится в etc
каталоге R. Также обратите внимание на последнюю часть пути, которая bin/x64
может измениться в соответствии с конфигурацией вашей системы. Надеюсь, это поможет и другим.
В соответствии с идеей Мартина Моргана об использовании .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)
}
Я думаю, что лучше всего использовать 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")
Это дает вам возможность приходить и уходить, когда вам угодно, и открывать столько рабочих мест, сколько вам нужно.
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, а затем закрывается, новое окно никогда не открывается. Если кто-то может прокомментировать это, пожалуйста, сделайте это)
Я написал следующую функцию. Помнить! Вы можете использовать его только один раз, затем вам нужно будет перезагрузить его после перезапуска сеанса 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
}
Иногда также помогает отсоединение пакета.
rm(list=ls())
но вы не это имеете в виду, верно?