识别给定类的所有对象以进行进一步处理

时间:2011-03-01 18:39:42

标签: r

假设您正在使用大型工作环境,并且您不擅长跟上环境变量,或者您有一些自动生成大量对象的流程。有没有办法扫描你的ls()以识别具有给定类的所有对象?请考虑以下简单示例:

#Random objects in my environment
x <- rnorm(100)
y <- rnorm(100)
z <- rnorm(100)

#I estimate some linear models for fun.
lm1 <- lm(y ~ x)
lm2 <- lm(y ~ z)
lm3 <- lm(y ~ x + z)

#Is there a programmatic way to identify all objects in my environment 
#that are of the "lm" class? Or really, any arbitrary class?
outList <- list(lm1, lm2, lm3)

#I want to look at a bunch of plots for all the lm objects in my environment.
lapply(outList, plot)

1 个答案:

答案 0 :(得分:13)

使用class功能:

Models <- Filter( function(x) 'lm' %in% class( get(x) ), ls() )
lapply( Models, function(x) plot( get(x) ) )

(稍微修改以处理对象可以有多个类的情况,正如@Gabor在评论中指出的那样)。

更新 的。为了完整起见,以下是@ Gabor在下面的评论中提出的改进。有时我们可能只想获得X类但类Y的对象。或者也许是其他组合。为此,可以编写一个包含所有类过滤逻辑的ClassFilter()函数,例如:

ClassFilter <- function(x) inherits(get(x), 'lm' ) & !inherits(get(x), 'glm' )

然后你得到你想要的对象:

Objs <- Filter( ClassFilter, ls() )

现在您可以按照您想要的方式处理Objs