如何使用rm
删除R
中某个类型的所有对象?
我目前定义了一系列功能,我想要删除。
我知道ls
有一个pattern
选项,但这只会在我命名模式中的所有函数时才有用(我不是)。
答案 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
的对象(例如integer
,list
(数据框)或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
)