ลบตัวแปรทั้งหมดยกเว้นฟังก์ชัน


113

ฉันโหลดออบเจ็กต์ประเภทต่างๆในคอนโซล R แล้ว ฉันสามารถลบออกทั้งหมดโดยใช้

rm(list=ls())

หรือลบเฉพาะฟังก์ชัน (แต่ไม่ใช่ตัวแปร) โดยใช้

rm(list=lsf.str())

คำถามของฉันคือมีวิธีลบตัวแปรทั้งหมดยกเว้นฟังก์ชันหรือไม่

คำตอบ:


137

นี่คือซับเดียวที่ลบวัตถุทั้งหมดยกเว้นฟังก์ชัน:

rm(list = setdiff(ls(), lsf.str()))

ใช้setdiffเพื่อค้นหาชุดย่อยของวัตถุในสภาพแวดล้อมส่วนกลาง (ตามที่ส่งคืนโดยls()) ที่ไม่มีโหมดfunction(ตามที่ส่งคืนโดยlsf.str())


5
หากคุณต้องการลบวัตถุที่มีชื่อขึ้นต้นด้วยจุดให้ใช้สิ่งนี้แทน: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien

1
ขอบคุณมากสำหรับคำตอบนี้ ขอทราบประจำเดือนคืออะไร?
RockScience

1
แน่นอน จุด (ในภาษาอังกฤษแบบอเมริกัน) เป็นอีกชื่อหนึ่งของจุดเช่นนี้.หากต้องการดูว่าฉันกำลังพูดถึงอะไรลอง.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien

ดีมากขอบคุณ ฉันสังเกตแล้วว่า. j ไม่ได้รับผลกระทบจาก ls () แต่สามารถอธิบายได้
RockScience

7

setdiffคำตอบที่โพสต์เป็นสิ่งที่ดี ฉันแค่คิดว่าฉันจะโพสต์ฟังก์ชั่นที่เกี่ยวข้องนี้ฉันเขียนไว้สักพักแล้ว ประโยชน์ของมันขึ้นอยู่กับผู้อ่าน :-)

lstype<-function(type='closure'){ 
    inlist<-ls(.GlobalEnv)
    if (type=='function') type <-'closure'
    typelist<-sapply(sapply(inlist,get),typeof)
    return(names(typelist[typelist==type]))
}

1
ขอบคุณที่โพสต์ มันทำให้การเปรียบเทียบที่น่าสนใจกับโค้ดls.str()ซึ่งอย่างไรก็ตามการทดสอบmodeมากกว่าtypeofอ็อบเจกต์ (ในบันทึกด้านข้างฉันจะรู้สึกแย่ถ้าฉันสามารถหาข้อแตกต่างระหว่างสองสิ่งนี้ได้จากเอกสารของพวกเขา)
Josh O'Brien

ฉันมักจะใช้ class แทน typeof
RockScience

1

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อล้างตัวแปรทั้งหมด ระวังเพราะคุณไม่สามารถรับตัวแปรของคุณกลับคืนมาได้

rm(list=ls(all=TRUE))

1
น่ารู้ แต่นั่นไม่ใช่คำถาม
RockScience

ฉันเดาว่าฉันควรจะทิ้งสิ่งนั้นไว้เป็นความคิดเห็นเนื่องจากมันเป็น FYI มากกว่า ขออภัย.
lwileczek

0

นี่เป็นฟังก์ชั่นที่ค่อนข้างสะดวกที่ฉันหยิบขึ้นมาจากที่ไหนสักแห่งและปรับเปลี่ยนเล็กน้อย อาจจะดีที่จะเก็บไว้ในไดเรกทอรี

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

0

ฉันเขียนสิ่งนี้เพื่อลบวัตถุทั้งหมดนอกเหนือจากฟังก์ชันจากสภาพแวดล้อมปัจจุบัน (ภาษาโปรแกรมที่ใช้คือ 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]))


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