Есть ли способ, которым я могу сделать псевдоним, в R, который будет выполнять q()
а затем перезапустить чистый сеанс R?
И да, мне лень набирать q()
а потом букву R
:)
Есть ли способ, которым я могу сделать псевдоним, в R, который будет выполнять q()
а затем перезапустить чистый сеанс R?
И да, мне лень набирать q()
а потом букву R
:)
Если вы находитесь в RStudio: команда /ctrl + shift + F10
Вы также можете использовать
.rs.restartR()
В зависимости от того, как вы начинаете R, попробуйте поместить одну из этих строк в ваш файл .Rprofile
:
makeActiveBinding("refresh", function() { shell("Rgui"); q("no") }, .GlobalEnv)
makeActiveBinding("refresh", function() { system("R"); q("no") }, .GlobalEnv)
Затем введите это в консоль R:
refresh
выключит текущий сеанс и запустит новый.
Я обнаружил, что .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 пакет 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 будет сброшен. То есть он удаляет все данные из текущего сеанса и выгружает все загруженные пакеты в сеансе.
Мне нужна была такая же функциональность сессий обновления в Windows, и я закончил с немного модифицированной версией кода:
makeActiveBinding("refresh", function() { shell(paste0("start \"\" \"", R.home(), "/bin/x64/Rgui.exe\"")); q("no") }, .GlobalEnv)
В окнах вам нужно изменить файл Rprofile.site
. Он находится в каталоге R etc
. Также следите за последней частью пути, который может изменяться bin/x64
в соответствии с вашей конфигурацией системы. Надеюсь, это тоже поможет другим.
Я думаю, лучше всего реализовать R, установив текущий рабочий каталог в настройках. Тогда всякий раз, когда ваш файл рабочего пространства/сеанса начинает показывать вас или в нем достаточно вашей работы (между проектами), вы можете просто переименовать этот файл сеанса по умолчанию в рабочем каталоге после закрытия R, и R/Rstudio автоматически запустит вас в новом файл рабочей области/сессии, не мешая вашей текущей работе.
Не забудьте выйти из R и переименовать текущий файл сеанса
Конечно, если вы не хотите сохранять текущую работу, вы должны убедиться, что вы сбросили объекты или операции над ними были выполнены после копирования из исходных объектов, чтобы они были такими, как есть. Поверьте мне, зная, что вы всегда можете загрузить старые рабочие пространства, это искушение, но оно более полезно, чем нет.
Короче говоря, выход из R дает некоторый пробел, а выход означает, что это рабочее пространство заполнено, переименуйте его после завершения выхода и перезапустите R/Rstudio с новым рабочим пространством. Вы всегда можете загрузить выбранные объекты в новом рабочем пространстве. В идеале вся важная работа должна быть в каталогах проекта, но вам все еще нужна история ваших заданий, чтобы вернуться к ней время от времени, а сохраненные сеансы пригодятся в какой-то момент, когда вы будете работать над более длинными проектами. Если вам ничего не нужно, просто rm(list=ls())
Кроме того, мне нравится RDComClient
идея, @Eduardo Элвин, но оно было прекращено.
АЛЬТЕРНАТИВНЫЙ ВАРИАНТ
Простая альтернатива, чтобы избавиться от багажа в любое время в вашем рабочем пространстве, это использовать save.image
save.image("Rstreamingscience.data")
quit(save='no')
load("Rstreamingscience.data") ##G:/ADA registers##
save.image("Rstreamingscience.data")
Это позволяет вам приходить и уходить когда угодно и открывать столько рабочих мест, сколько вам нужно.
В качестве другой альтернативы Emacs ESS (> = 16.10) может перезагрузить подчиненный процесс R через inferior-ess-r-reload-hook
который по умолчанию связан с Cc Ce Cr
.
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() перед вызовом refresh (хотя ни эта, ни оригинальная версия не работают для меня, поскольку она перезапускает 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
}
Иногда отключение пакета также помогает.
В соответствии с идеей Мартина Моргана использовать .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)
}