ฉันโหลดออบเจ็กต์ประเภทต่างๆในคอนโซล R แล้ว ฉันสามารถลบออกทั้งหมดโดยใช้
rm(list=ls())
หรือลบเฉพาะฟังก์ชัน (แต่ไม่ใช่ตัวแปร) โดยใช้
rm(list=lsf.str())
คำถามของฉันคือมีวิธีลบตัวแปรทั้งหมดยกเว้นฟังก์ชันหรือไม่
ฉันโหลดออบเจ็กต์ประเภทต่างๆในคอนโซล R แล้ว ฉันสามารถลบออกทั้งหมดโดยใช้
rm(list=ls())
หรือลบเฉพาะฟังก์ชัน (แต่ไม่ใช่ตัวแปร) โดยใช้
rm(list=lsf.str())
คำถามของฉันคือมีวิธีลบตัวแปรทั้งหมดยกเว้นฟังก์ชันหรือไม่
คำตอบ:
นี่คือซับเดียวที่ลบวัตถุทั้งหมดยกเว้นฟังก์ชัน:
rm(list = setdiff(ls(), lsf.str()))
ใช้setdiff
เพื่อค้นหาชุดย่อยของวัตถุในสภาพแวดล้อมส่วนกลาง (ตามที่ส่งคืนโดยls()
) ที่ไม่มีโหมดfunction
(ตามที่ส่งคืนโดยlsf.str()
)
.
หากต้องการดูว่าฉันกำลังพูดถึงอะไรลอง.j <- 5; ls(); ls(all.names=TRUE)
setdiff
คำตอบที่โพสต์เป็นสิ่งที่ดี ฉันแค่คิดว่าฉันจะโพสต์ฟังก์ชั่นที่เกี่ยวข้องนี้ฉันเขียนไว้สักพักแล้ว ประโยชน์ของมันขึ้นอยู่กับผู้อ่าน :-)
lstype<-function(type='closure'){
inlist<-ls(.GlobalEnv)
if (type=='function') type <-'closure'
typelist<-sapply(sapply(inlist,get),typeof)
return(names(typelist[typelist==type]))
}
ls.str()
ซึ่งอย่างไรก็ตามการทดสอบmode
มากกว่าtypeof
อ็อบเจกต์ (ในบันทึกด้านข้างฉันจะรู้สึกแย่ถ้าฉันสามารถหาข้อแตกต่างระหว่างสองสิ่งนี้ได้จากเอกสารของพวกเขา)
คุณสามารถใช้คำสั่งต่อไปนี้เพื่อล้างตัวแปรทั้งหมด ระวังเพราะคุณไม่สามารถรับตัวแปรของคุณกลับคืนมาได้
rm(list=ls(all=TRUE))
นี่เป็นฟังก์ชั่นที่ค่อนข้างสะดวกที่ฉันหยิบขึ้นมาจากที่ไหนสักแห่งและปรับเปลี่ยนเล็กน้อย อาจจะดีที่จะเก็บไว้ในไดเรกทอรี
list.objects <- function(env = .GlobalEnv)
{
if(!is.environment(env)){
env <- deparse(substitute(env))
stop(sprintf('"%s" must be an environment', env))
}
obj.type <- function(x) class(get(x, envir = env))
foo <- sapply(ls(envir = env), obj.type)
object.name <- names(foo)
names(foo) <- seq(length(foo))
dd <- data.frame(CLASS = foo, OBJECT = object.name,
stringsAsFactors = FALSE)
dd[order(dd$CLASS),]
}
> x <- 1:5
> d <- data.frame(x)
> list.objects()
# CLASS OBJECT
# 1 data.frame d
# 2 function list.objects
# 3 integer x
> list.objects(env = x)
# Error in list.objects(env = x) : "x" must be an environment
ฉันเขียนสิ่งนี้เพื่อลบวัตถุทั้งหมดนอกเหนือจากฟังก์ชันจากสภาพแวดล้อมปัจจุบัน (ภาษาโปรแกรมที่ใช้คือ R กับ IDE R-Studio):
remove_list=c() # create a vector
for(i in 1:NROW(ls())){ # repeat over all objects in environment
if(class(get(ls()[i]))!="function"){ # if object is *not* a function
remove_list=c(remove_list,ls()[i]) # ..add to vector remove_list
}
}
rm(list=remove_list) # remove all objects named in remove_list
หมายเหตุ -
อาร์กิวเมนต์ "list" ใน rm (list =) ต้องเป็นเวกเตอร์อักขระ
ชื่อของอ็อบเจ็กต์ในตำแหน่ง i ของสภาพแวดล้อมปัจจุบันถูกส่งคืนจาก ls () [i] และอ็อบเจ็กต์เองจาก get (ls () [i]) ดังนั้นคลาสของอ็อบเจ็กต์จึงถูกส่งกลับจากคลาส (get (ls () [i]))
rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))