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.