eliminar todas las variables excepto las funciones

113

He cargado en una consola R diferentes tipos de objetos. Puedo eliminarlos todos usando

rm(list=ls())

o eliminar solo las funciones (pero no las variables) usando

rm(list=lsf.str())

Mi pregunta es: ¿hay alguna manera de eliminar todas las variables excepto las funciones?

RockScience
fuente

Respuestas:

137

Aquí hay una sola línea que elimina todos los objetos excepto las funciones:

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

Se usa setdiffpara encontrar el subconjunto de objetos en el entorno global (como lo devuelve ls()) que no tienen modo function(como lo devuelve lsf.str())

Josh O'Brien
fuente
5
Si también desea eliminar objetos cuyos nombres comiencen con un punto, use esto en su lugar: rm(list=setdiff(ls(all.names=TRUE), lsf.str(all.names=TRUE)))
Josh O'Brien
1
Muchas gracias por esta respuesta. ¿Puedo saber qué es un período?
RockScience
1
Por supuesto. Un punto (en inglés americano) es otro nombre para un punto, como este: .Para ver de qué estoy hablando, intente.j <- 5; ls(); ls(all.names=TRUE)
Josh O'Brien
genial, gracias. Ya me di cuenta de que .j no se vio afectado por ls () pero podría explicarlo.
RockScience
7

La setdiffrespuesta publicada es buena. Pensé en publicar esta función relacionada que escribí hace un tiempo. Su utilidad depende del lector :-).

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
fuente
1
Gracias por publicar eso. Se convierte en una interesante comparación con el código para ls.str()que, sin embargo, pone a prueba la modevez de la typeofde los objetos. (En una nota al margen, estaré maldito si puedo calcular la diferencia entre esos dos a partir de su documentación).
Josh O'Brien
Siempre uso class en lugar de typeof
RockScience
1

Puede usar el siguiente comando para borrar TODAS las variables. Tenga cuidado porque no puede recuperar sus variables.

rm(list=ls(all=TRUE))
lwileczek
fuente
1
Es bueno saberlo, pero esa no es la pregunta
RockScience
Supongo que debería haber dejado eso como comentario ya que era más un FYI. Lo siento.
lwileczek
0

Aquí hay una función bastante conveniente que recogí en algún lugar y ajusté un poco. Sería bueno mantenerlo en el directorio.

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
fuente
0

Escribí esto para eliminar todos los objetos además de las funciones del entorno actual (el lenguaje de programación utilizado es R con 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

Notas

El argumento "lista" en rm (lista =) debe ser un vector de caracteres.

El nombre de un objeto en la posición i del entorno actual se devuelve de ls () [i] y el objeto en sí mismo de get (ls () [i]). Por lo tanto, la clase de un objeto se devuelve desde class (get (ls () [i]))

Hombro Gigante
fuente
Agregue más información sobre el "entorno actual", por ejemplo, si es shell o cierto lenguaje de programación
DiveIntoML