从全局环境中排除特定对象类型

时间:2015-01-25 22:03:15

标签: r dataframe

我在全球环境中加载了许多不同的对象。如何只排除数据框并保留其他对象?例如:

DF1 <- data.frame(rnorm(10))
DF2 <- data.frame(rnorm(10))
DF3 <- data.frame(rnorm(10))

list1 <- list("a", "b", "c")
list2 <- list("a", "b", "c")
tf <- tempfile()
td <- tempdir()

我想到的解决方案看起来像这样(当然它不起作用)

remove(pattern="*.Rdata")

1 个答案:

答案 0 :(得分:8)

这是我用于此类任务的函数。 rmSome()就是这样做,只从环境中删除某些对象。它通过将第一个参数中给出的函数(即is*函数(如is.data.frame()用于数据框,is.list()用于列表等))应用于给定的对象列表来实现此目的环境并过滤掉结果。

rmSome <- function(FUN, env = globalenv(), negate = FALSE) {
    fun <- match.fun(FUN)
    if(negate) fun <- Negate(fun)
    objget <- mget(ls(envir = env), envir = env)
    rmnames <- names(Filter(fun, objget))
    rm(list = rmnames, envir = env)
}

例如,您可以使用

从全局环境中删除所有数据框
rmSome(is.data.frame)

因此,对于您给出的示例,您可以删除所有数据框,如下所示:

## -- rm(list=ls()) here --
## Define rmSome() here 
DF1 <- data.frame(rnorm(10))
DF2 <- data.frame(rnorm(10))
DF3 <- data.frame(rnorm(10))
list1 <- list("a", "b", "c")
list2 <- list("a", "b", "c")
tf <- tempfile()
td <- tempdir()

## remove all data frames
rmSome(is.data.frame)
ls()
# [1] "list1"  "list2"  "rmSome" "td"     "tf"    

另一方面,如果你想保留所有数据框并删除其他所有数据框,你就会否定删除这样的数据框:

rmSome(is.data.frame, negate = TRUE)

到目前为止,我还没有发现使用其他功能(例如is.numeric()is.environment()等)来删除数字,环境等方面的任何问题。但该功能目前尚未设置一次处理多个对象类型。

2015年1月28日更新: eapply()也可用于将功能应用于环境。如果你不喜欢mget(),这是你可以使用的第二个功能。它可以和上面的调用一样使用,也许是更好的方法。

rmSome2 <- function(FUN, env = globalenv(), negate = FALSE)  {
    fun <- match.fun(FUN)
    if(negate) fun <- Negate(fun)
    ue <- unlist(eapply(env, fun))
    rm(list = names(ue)[ue], envir = env)
}