问题描述
我可以通过使用以下代码来做到这一点:
l<-ls()
l[sapply(l,function(x) is.data.frame(get(x)))]
解决方法
您必须注意,ls()
默认情况下会列出 current 环境中的对象。如果将代码包装在函数中,则此 current 环境是内部 function 环境,该环境在此时为空(我们位于函数的第一行,没有任何内容已经定义)。由于您对全局环境感兴趣,因此必须使用.GlobalEnv
明确指定它:
lsf <- function() {
l<-ls(.GlobalEnv)
l[sapply(l,function(x) is.data.frame(get(x,envir = .GlobalEnv)))]
}
lsf()
,
也许您可以尝试下面的代码
list.df <- function() names(Filter(is.data.frame,mget(ls())))
,
您可以在环境中使用as.list
,然后将sapply
与is.whatever
一起使用,如下所示:
list_all_x <- function(is.x = is.data.frame,env = .GlobalEnv){
env <- as.list(env)
names(env)[sapply(env,is.x)]
}
# or related to ThomasIsCoding's great answer
list_all_x <- function(is.x = is.data.frame,env = .GlobalEnv)
names(Filter(is.x,as.list(env)))
# check the function
d1 <- numeric()
d2 <- data.frame()
d3 <- data.frame()
list_all_x()
#R> [1] "d2" "d3"
list_all_x(is.x = is.numeric)
#R> [1] "d1"
如果您想使用env
参数将函数应用于其他环境,或者通过更改is.x
参数来查找另一种类型,则可以使用上述方法。