ฉันจะลบวัตถุทั้งหมดยกเว้นวัตถุจากพื้นที่ทำงานใน R ได้อย่างไร


220

ฉันมีพื้นที่ทำงานที่มีวัตถุจำนวนมากและฉันต้องการที่จะลบทั้งหมดยกเว้นหนึ่ง rm(obj.1, obj.2... obj.n)นึกคิดฉันต้องการที่จะหลีกเลี่ยงการประเภท เป็นไปได้ที่จะระบุ remove all objects but these ones?

คำตอบ:


375

นี่คือโครงสร้างอย่างง่ายที่จะทำโดยใช้setdiff:

rm(list=setdiff(ls(), "x"))

และเป็นตัวอย่างที่สมบูรณ์ ดำเนินการด้วยความเสี่ยงของคุณเองซึ่งจะลบตัวแปรทั้งหมดยกเว้นx:

x <- 1
y <- 2
z <- 3
ls()
[1] "x" "y" "z"

rm(list=setdiff(ls(), "x"))

ls()
[1] "x"

8
เทคนิคที่ใช้ที่นี่คือการใช้ list = to rm ซึ่งอนุญาตให้เวกเตอร์อักขระถูกส่งผ่านไปยัง rm แทนที่จะเป็นรายชื่อ
Spacedman

54

การใช้keepฟังก์ชั่นจากgdataแพ็คเกจค่อนข้างสะดวก

> ls()
[1] "a" "b" "c"

library(gdata)
> keep(a) #shows you which variables will be removed
[1] "b" "c"
> keep(a, sure = TRUE) # setting sure to TRUE removes variables b and c
> ls()
[1] "a"

ฉันพบว่าการใช้ "Keep" จาก gdata ดูเหมือนจะสมเหตุสมผลมากกว่าและง่ายต่อการจดจำว่าความซับซ้อนทั้งหมดของ comand ใน base R
Darius

47

ฉันคิดว่าตัวเลือกอื่นคือการเปิดพื้นที่ทำงานใน RStudio แล้วเปลี่ยนรายการเป็นกริดที่มุมขวาบนของสภาพแวดล้อม (ภาพด้านล่าง) จากนั้นทำเครื่องหมายวัตถุที่คุณต้องการล้างแล้วคลิกสุดท้ายเพื่อล้าง

ป้อนคำอธิบายรูปภาพที่นี่


3
ในทำนองเดียวกันคลิกกล่องชื่อซึ่งเลือกไฟล์ทั้งหมดแล้วยกเลิกการเลือกไฟล์ทั้งหมดที่คุณต้องการเก็บไว้
สตีเฟ่น

27

ฉันใช้เวลาหลายชั่วโมงในการหาคำตอบของคำถามที่คล้ายกัน แต่แตกต่างกันเล็กน้อย - ฉันต้องสามารถลบวัตถุทั้งหมดใน R (รวมถึงฟังก์ชั่น) ยกเว้นเวกเตอร์จำนวนหนึ่ง

วิธีหนึ่งในการทำสิ่งนี้:

rm(list=ls()[! ls() %in% c("a","c")])

ที่เวกเตอร์ที่ฉันต้องการเก็บไว้มีชื่อว่า 'a' และ 'c'

หวังว่านี่จะช่วยให้ทุกคนค้นหาโซลูชันเดียวกัน!


11
สิ่งนี้ควรใช้งานได้rm(list=setdiff(ls(), c("a", "c")))จริงไหม ดูคำตอบของ @ Andrie
hplieninger



6

นี้ใช้ประโยชน์จากls()ของpatternตัวเลือกในกรณีที่คุณมีจำนวนมากของวัตถุที่มีรูปแบบเดียวกันกับที่คุณไม่ต้องการที่จะเก็บ:

> foo1 <- "junk"; foo2 <- "rubbish"; foo3 <- "trash"; x <- "gold"  
> ls()
[1] "foo1" "foo2" "foo3" "x"   
> # Let's check first what we want to remove
> ls(pattern = "foo")
[1] "foo1" "foo2" "foo3"
> rm(list = ls(pattern = "foo"))
> ls()
[1] "x"

โอ้โหนั่นดูอันตรายนะ! มีวิธีทดสอบรูปแบบที่ตรงกับ la "echo" ในเปลือกหรือไม่?
DQdlM

1
ฉันเดาว่าrmควรใช้ฟังก์ชั่นนี้ด้วยความระมัดระวังเสมอไป ดูการแก้ไขของฉันสำหรับคำตอบสำหรับคำถามของคุณ
Peter Diakumis


3

ลองคิดแบบอื่นถ้าเราต้องการลบกลุ่ม? ลองนี้

 rm(list=ls()[grep("xxx",ls())]) 

โดยส่วนตัวฉันไม่ชอบตารางตัวแปรบนหน้าจอมากเกินไป แต่ฉันไม่สามารถหลีกเลี่ยงได้ ดังนั้นฉันตั้งชื่อสิ่งชั่วคราวที่เริ่มต้นด้วย "xxx" ดังนั้นฉันสามารถลบออกได้หลังจากที่ไม่ได้ใช้อีกต่อไป


2

จากภายในฟังก์ชั่น rm วัตถุทั้งหมดใน. GlobalEnv ยกเว้นฟังก์ชั่น

initialize <- function(country.name) {

  if (length(setdiff(ls(pos = .GlobalEnv), "initialize")) > 0) {
    rm(list=setdiff(ls(pos = .GlobalEnv), "initialize"), pos = .GlobalEnv)
  }

}


1

แล้วเรื่องนี้ล่ะ

# Removes all objects except the specified & the function itself.

rme <- function(except=NULL){
  except = ifelse(is.character(except), except, deparse(substitute(except)))
  rm(list=setdiff(ls(envir=.GlobalEnv), c(except,"rme")), envir=.GlobalEnv)
}

1

สมมติว่าคุณต้องการลบทุกวัตถุยกเว้น df จากสภาพแวดล้อม:

rm(list = ls(pattern="[^df]"))


-9

ต่อไปนี้จะลบวัตถุทั้งหมดออกจากคอนโซลของคุณ

rm(list = ls())

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