işlevler dışındaki tüm değişkenleri kaldır


113

Bir R konsoluna farklı türde nesneler yükledim. Hepsini kullanarak kaldırabilirim

rm(list=ls())

veya yalnızca işlevleri (değişkenleri değil) kaldırın

rm(list=lsf.str())

Sorum şu: işlevler dışındaki tüm değişkenleri kaldırmanın bir yolu var mı

Yanıtlar:


137

İşte işlevler dışındaki tüm nesneleri kaldıran tek satırlık bir ürün :

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

O kullanır setdiff(döndürdüğü gibi küresel ortamda nesnelerin alt kümesini bulmak için ls()modu yok) function(döndürdüğü olarak lsf.str())


5
Adları nokta ile başlayan nesneleri de kaldırmak istiyorsanız, bunun yerine şunu kullanın: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien

1
Bu cevap için çok teşekkürler. Dönem nedir bilebilir miyim?
RockScience

1
Elbette. Nokta (Amerikan İngilizcesinde) nokta için başka bir isimdir, şuna benzer: Neden .bahsettiğimi görmek için şunu deneyin.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien

harika teşekkür ederim. .J'nin ls () 'den etkilenmediğini zaten fark ettim ama bunu açıklayabilirim.
RockScience

7

Gönderilen setdiffcevap güzel. Bir süre önce yazdığım bu ilgili işlevi göndereceğimi düşündüm. Kullanışlılığı okuyucuya kalmış :-).

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

1
Bunu gönderdiğiniz için teşekkürler. ls.str()Bununla birlikte, nesneler modeyerine test eden kodla ilginç bir karşılaştırma yapar typeof. (Bir yan notta, bu ikisi arasındaki farkı belgelerinden anlayabilirsem, kahrolurum).
Josh O'Brien

Her zaman typeof yerine class kullanıyorum
RockScience

1

TÜM değişkenleri temizlemek için aşağıdaki komutu kullanabilirsiniz. Dikkatli olun çünkü değişkenlerinizi geri alamazsınız.

rm(list=ls(all=TRUE))

1
Bilmekte
fayda

Sanırım daha çok bir FYI olduğu için bunu bir yorum olarak bırakmalıydım. Afedersiniz.
lwileczek

0

İşte bir yerden aldığım ve biraz ayarladığım oldukça kullanışlı bir işlev. Dizinde tutmak güzel olabilir.

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

Bunu, mevcut ortamdaki işlevler dışındaki tüm nesneleri kaldırmak için yazdım (Kullanılan programlama dili IDE R-Studio ile R'dir):

    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

attı-

Rm (list =) içindeki "list" argümanı bir karakter vektörü olmalıdır.

Mevcut ortamın i konumundaki bir nesnenin adı ls () [i] 'den ve nesnenin kendisi de get (ls () [i])' den döndürülür. Bu nedenle, bir nesnenin sınıfı sınıftan döndürülür (get (ls () [i]))


Lütfen "mevcut ortam" hakkında daha fazla bilgi ekleyin, örneğin bunun kabuk mu yoksa belirli bir programlama dili mi olduğu
DiveIntoML
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.