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

R 从全局环境中排除特定对象类型,r,dataframe,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() 这是一个用于执行类似任

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

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()

这是一个用于执行类似任务的函数
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)
}
因此,对于给定的示例,您可以删除所有数据帧,如下所示:

## -- 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)
}
rmSome2
rmSome(is.data.frame, negate = TRUE)
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)
}