supprimer toutes les variables sauf les fonctions

113

J'ai chargé dans une console R différents types d'objets. Je peux tous les supprimer en utilisant

rm(list=ls())

ou supprimez uniquement les fonctions (mais pas les variables) en utilisant

rm(list=lsf.str())

Ma question est la suivante: existe-t-il un moyen de supprimer toutes les variables à l'exception des fonctions

RockScience
la source

Réponses:

137

Voici un one-liner qui supprime tous les objets à l' exception des fonctions:

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

Il utilise setdiffpour trouver le sous-ensemble d'objets dans l'environnement global (comme retourné par ls()) qui n'ont pas de mode function(comme retourné par lsf.str())

Josh O'Brien
la source
5
Si vous souhaitez également supprimer des objets dont les noms commencent par un point, utilisez plutôt ceci: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien
1
Merci beaucoup pour cette réponse. Puis-je savoir ce qu'est une période?
RockScience
1
Sûr. Un point (en anglais américain) est un autre nom pour un point, comme ceci: .pour voir de quoi je parle, essayez.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien
super merci. J'ai déjà remarqué que .j n'était pas affecté par ls () mais je pouvais l'expliquer.
RockScience
7

La setdiffréponse publiée est agréable. Je pensais juste publier cette fonction connexe que j'ai écrite il y a quelque temps. Son utilité dépend du lecteur :-).

lstype<-function(type='closure'){ 
    inlist<-ls(.GlobalEnv)
    if (type=='function') type <-'closure'
    typelist<-sapply(sapply(inlist,get),typeof)
    return(names(typelist[typelist==type]))
}
Carl Witthoft
la source
1
Merci d'avoir publié ça. Cela fait une comparaison intéressante avec le code pour ls.str()lequel, cependant, teste les objets modeplutôt que les typeof. (Sur une note secondaire, je serai sacrément si je peux comprendre la différence entre ces deux à partir de leur documentation).
Josh O'Brien
J'utilise toujours la classe au lieu de typeof
RockScience
1

Vous pouvez utiliser la commande suivante pour effacer TOUTES les variables. Soyez prudent car vous ne pouvez pas récupérer vos variables.

rm(list=ls(all=TRUE))
Lwileczek
la source
1
Bon à savoir mais ce n'est pas la question
RockScience
J'imagine que j'aurais dû laisser cela comme commentaire car il s'agissait davantage d'un FYI. Désolé.
lwileczek
0

Voici une fonction assez pratique que j'ai choisie quelque part et ajustée un peu. Cela pourrait être bien de garder dans le répertoire.

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
Rich Scriven
la source
0

J'ai écrit ceci pour supprimer tous les objets en dehors des fonctions de l'environnement actuel (le langage de programmation utilisé est R avec 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

Remarques-

L'argument "list" dans rm (list =) doit être un vecteur de caractères.

Le nom d'un objet en position i de l'environnement courant est renvoyé par ls () [i] et l'objet lui-même par get (ls () [i]). Par conséquent, la classe d'un objet est renvoyée par class (get (ls () [i]))

GéantÉpaule
la source
Veuillez ajouter plus d'informations sur "l'environnement actuel", par exemple s'il s'agit d'un shell ou d'un certain langage de programmation
DiveIntoML