从全局环境中排除特定对象类型
Exclude specific object type from the global environment
我在全局环境中加载了很多不同的对象。如何仅排除数据框并保留其他对象?示例:
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")
这是我用于此类任务的函数。 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)
}
我在全局环境中加载了很多不同的对象。如何仅排除数据框并保留其他对象?示例:
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")
这是我用于此类任务的函数。 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)
}