ออกจากและรีสตาร์ทเซสชัน R ที่สะอาดจากภายใน R?


88

มีวิธีใดบ้างที่ฉันสามารถสร้างนามแฝงภายใน R ซึ่งจะดำเนินการq()แล้วเริ่มเซสชัน R ใหม่ทั้งหมด

และใช่ฉันขี้เกียจพิมพ์q()แล้วตามด้วยตัวอักษรR:)


คุณสามารถล้างพื้นที่ทำงานของคุณได้rm(list=ls())แต่นั่นไม่ใช่สิ่งที่คุณหมายถึงใช่ไหม
Sacha Epskamp

2
คุณต้องการถอดหีบห่อและสิ่งอื่น ๆ ที่คุณอาจแนบมาด้วยหรือไม่?
Spacedman

2
บางทีคำแนะนำอย่างหนึ่งอาจเป็นการเพิ่มsaveพารามิเตอร์ตัวเลือกใหม่ให้q()เช่น"r"ที่รีสตาร์ท R โดยไม่บันทึกพื้นที่ทำงาน จากนั้นนามแฝงสำหรับq("r")สามารถกำหนดให้กับฟังก์ชันใหม่ที่รีสตาร์ท R.
Greg

คำตอบ:


80

หากคุณอยู่ใน RStudio: command / ctrl + shift + F10

คุณยังสามารถใช้

.rs.restartR()

12
ฉันเชื่อว่าการเปิด "เซสชัน R ที่สะอาด" ต้องการให้ 1-Data จากเซสชันปัจจุบันถูกลบออก 2 แพ็กเกจจากเซสชันปัจจุบันจะถูกยกเลิกการโหลด .rs.restartR()ดูเหมือนจะไม่ทำอย่างใดอย่างหนึ่งบนเครื่องของฉัน ..
steadyfish

3
ฉันพบว่า. rs.restartR () มีประโยชน์สำหรับกรณีที่ R ไม่เพิ่มหน่วยความจำแม้ว่าจะลบ (list = ls ()); gc ();. สิ่งนี้ช่วยเพิ่มความทรงจำได้อย่างแน่นอน ฉันชอบความจริงที่ว่ามันไม่ได้แยกแพ็คเกจออก
Richard DiSalvo

57

ขึ้นอยู่กับว่าคุณเริ่มต้นอย่างไร 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 อยู่บนเส้นทางของคุณ
G.Grothendieck

2
โซลูชันนี้ใช้งานได้ แต่ไม่สามารถทำซ้ำได้เมื่อสคริปต์ของฉันถูกเรียกใช้โดยผู้อื่น มีคำสั่งที่จะรวมอยู่ในสคริปต์ R เพื่อรีสตาร์ทเซสชัน R หรือไม่ (เหตุผลคือฉันต้องการให้แพ็คเกจทั้งหมดถูกแยกออก)
Heisenberg

13

ฉันพบว่า. rs.restartR () ทำงานคล้ายกับการกด ctrl + shift + F10 แต่ไม่ควรยกเลิกการบรรจุหีบห่อ


ใช้งานได้ใน RStudio - แต่ฉันไม่แน่ใจว่ามีวิธีทำให้ใช้งานได้ทุกที่ จากที่getAnywhere(".rs.restartR")ดูเหมือนจะอยู่ในtools:rstudio. ฉันไม่มีโชคในการเข้าถึงสิ่งนั้นในเซสชัน R บริสุทธิ์
Gregor Thomas

11
.rs.restartR()ไม่ได้ยกเลิกการโหลดแพคเกจเพื่อให้มันเป็นไปไม่ตรงเช่นเดียวกับctrl+shift+f10
อาร์เธอร์

7

อีกทางเลือกหนึ่งคือ Emacs ESS (> = 16.10) สามารถโหลดกระบวนการ R ที่ด้อยกว่าอีกครั้งinferior-ess-r-reload-hookซึ่งถูกผูกไว้C-c C-e C-rโดยค่าเริ่มต้น


ได้ผล! เก่ง!
ตัวแทน 18

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 โดย '+' คำอธิบายทั้งหมดสำหรับ representaions คีย์นี้มีอยู่ที่นี่

หลังจากเรียกใช้บรรทัดสุดท้ายของโค้ดด้านบนเซสชัน R ทั้งหมดใน RStudio จะถูกรีเซ็ตตามความคิดเห็นของ@steadyfish นั่นคือจะลบข้อมูลทั้งหมดออกจากเซสชันปัจจุบันและยกเลิกการโหลดแพ็คเกจที่โหลดทั้งหมดในเซสชัน


2

เขียนฟังก์ชันนี้ใน. Rprofile ของคุณ

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

r()รีสตาร์ทเซสชัน R ของคุณ แพ็กเกจที่โหลดจะไม่โหลดซ้ำ สภาพแวดล้อมของคุณจะไม่ถูกบันทึก

ใช้งานได้กับ Linux ไม่รู้ว่าจะเกิดอะไรขึ้นใน OS อื่น


1

ฉันต้องการฟังก์ชั่นการรีเฟรชเซสชันเดียวกันบน windows และลงเอยด้วยโค้ดเวอร์ชันที่แก้ไขเล็กน้อย

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

บน windows คุณต้องแก้ไขRprofile.siteไฟล์ อยู่ภายใต้etcไดเรกทอรีของ R นอกจากนี้ระวังส่วนสุดท้ายของเส้นทางที่bin/x64สามารถเปลี่ยนแปลงได้ตามการกำหนดค่าระบบของคุณ ฉันหวังว่านี่จะช่วยคนอื่นด้วย


1

สอดคล้องกับแนวคิดของ Martin Morgan ในการใช้.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()ในแพ็คเกจเริ่มต้นเป็นวิธีที่สะดวกในการรีสตาร์ท R.
HenrikB

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")

ทำให้คุณมีอิสระที่จะไปไหนมาไหนได้ตามต้องการและเปิดพื้นที่ทำงานได้มากเท่าที่คุณต้องการ


0
makeActiveBinding("refresh", function() { system(paste0(R.home(),"/bin/i386/R")); q("no") }, .GlobalEnv)

หรือด้วย - บันทึกหรือ - ไม่บันทึก

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
}

บางครั้งการถอดแพ็คเกจก็ช่วยได้เช่นกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.