มีวิธีใดบ้างที่ฉันสามารถสร้างนามแฝงภายใน 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
อีกทางเลือกหนึ่งคือ Emacs ESS (> = 16.10) สามารถโหลดกระบวนการ R ที่ด้อยกว่าอีกครั้งinferior-ess-r-reload-hook
ซึ่งถูกผูกไว้C-c C-e C-r
โดยค่าเริ่มต้น
โพสต์เก่า แต่ไม่มีคำตอบใดที่ใช้ได้ผล (สำหรับฉันฉันใช้ 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 โดย '+' คำอธิบายทั้งหมดสำหรับ representaions คีย์นี้มีอยู่ที่นี่
หลังจากเรียกใช้บรรทัดสุดท้ายของโค้ดด้านบนเซสชัน R ทั้งหมดใน RStudio จะถูกรีเซ็ตตามความคิดเห็นของ@steadyfish นั่นคือจะลบข้อมูลทั้งหมดออกจากเซสชันปัจจุบันและยกเลิกการโหลดแพ็คเกจที่โหลดทั้งหมดในเซสชัน
เขียนฟังก์ชันนี้ใน. Rprofile ของคุณ
r <- function() {
assign('.Last', function() {system('R')}, envir = globalenv())
quit(save = 'no')
}
r()
รีสตาร์ทเซสชัน R ของคุณ แพ็กเกจที่โหลดจะไม่โหลดซ้ำ สภาพแวดล้อมของคุณจะไม่ถูกบันทึก
ใช้งานได้กับ Linux ไม่รู้ว่าจะเกิดอะไรขึ้นใน OS อื่น
ฉันต้องการฟังก์ชั่นการรีเฟรชเซสชันเดียวกันบน windows และลงเอยด้วยโค้ดเวอร์ชันที่แก้ไขเล็กน้อย
makeActiveBinding("refresh", function() { shell(paste0("start \"\" \"", R.home(), "/bin/x64/Rgui.exe\"")); q("no") }, .GlobalEnv)
บน windows คุณต้องแก้ไขRprofile.site
ไฟล์ อยู่ภายใต้etc
ไดเรกทอรีของ R นอกจากนี้ระวังส่วนสุดท้ายของเส้นทางที่bin/x64
สามารถเปลี่ยนแปลงได้ตามการกำหนดค่าระบบของคุณ ฉันหวังว่านี่จะช่วยคนอื่นด้วย
สอดคล้องกับแนวคิดของ 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)
}
ฉันคิดว่าหนึ่งตระหนักถึงการใช้ 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)
หรือด้วย - บันทึกหรือ - ไม่บันทึก
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())
แต่นั่นไม่ใช่สิ่งที่คุณหมายถึงใช่ไหม