Чи можу я зробити псевдонім у межах R, який буде виконуватись, q()
а потім перезапустити чистий R-сеанс?
І так, мені лінь друкувати, q()
а потім лист R
:)
Чи можу я зробити псевдонім у межах R, який буде виконуватись, q()
а потім перезапустити чистий R-сеанс?
І так, мені лінь друкувати, q()
а потім лист R
:)
save
параметра 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-пакет 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 . Тобто він видаляє всі дані з поточного сеансу та вивантажує всі завантажені пакети в сеансі.
Запишіть цю функцію у свій .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)
У вікнах вам потрібно змінити 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)
}
startup::restart()
до стартового пакету як
Я думаю, хтось реалізує найкраще використання 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")
Це дозволяє вам вільно приходити і їхати, як вам заманеться, і відкривати стільки робочих місць, скільки вам потрібно.
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())
але це не те, що ви маєте на увазі?