删除R中给定类型的所有对象

时间:2015-06-10 21:32:05

标签: r

如何使用rm删除R中某个类型的所有对象?

我目前定义了一系列功能,我想要删除。

我知道ls有一个pattern选项,但这只会在我命名模式中的所有函数时才有用(我不是)。

5 个答案:

答案 0 :(得分:6)

@ Jilber答案的变体:

rm(list=names(Filter(is.function, mget(ls(all=T)))))

答案 1 :(得分:3)

我的解决方案基本上是使用mget来获取ls()中所有内容的类,然后根据ls()时间点class=="function"进行子集:

rm(list=ls(all=TRUE)[sapply(mget(ls(all=TRUE)), class) == "function"])

@Jilber提出了一个更清洁的选择:

rm(list=ls(all=TRUE)[sapply(mget(ls(all=TRUE)), is.function)])

这些基本方法可以扩展到适应更复杂的种族灭绝" (特定类别的清除):

rm(list=ls(all=TRUE)[sapply(mget(ls(all=TRUE)), class) %in% 
    c("function", "numeric")])
rm(list=ls(all=TRUE)[sapply(mget(ls(all=TRUE)),
                            function(x) is.function(x) | is.numeric(x))])

@Jilber的方法还有一个优势,它可以捕获多类对象(最值得注意的是,data.table s。

假设我们要删除所有data.frame不是(也)data.table s:

rm(list=ls(all=TRUE)[sapply(mget(ls(all=TRUE)),
                            function(x) is.data.frame(x) & !is.data.table(x))])

答案 2 :(得分:3)

您可以尝试ls.str,在其中列出某个mode的对象(例如integerlist(数据框)或function),或者lsf.str(仅返回函数):

# some objects to 'look for'
int1 <- 1
char1 <- "a"
list1 <- data.frame(x1, x2)
fun1 <- function() x1 + x2

# ls()
# ls.str()
ls.str(mode = "function")
funs <- as.character(ls.str(mode = "function"))

lsf.str()
funs <- as.character(lsf.str())

# rm(funs)

答案 3 :(得分:3)

ls.str()函数接受模式参数。您可以使用以下命令获取全局环境中的所有功能:

ls.str( mode="function")  # or in a different environment if properly created

exists函数测试是否可以找到它并且可以限制为特定模式。这对正在运行的会话具有潜在的破坏性影响

rm( list = ls()[ sapply( ls(), exists, mode="function")] )
# test for errors and effectiveness
any( sapply( ls(), exists, mode="function"))
# [1] FALSE

如果您尝试仅删除具有特定模式的函数,则可以在ls()返回的字符向量中选择grepl

答案 4 :(得分:2)

如果您有Dirk's lsos function(也可在stackoverflow包中找到),那么您可以这样做:

rm(list=rownames(subset(lsos(), Type == "POSIXct")))

如果类没有用于类型检查的内置谓词(例如is.function

,这可能很有用