R语言 标识给定类的所有对象以供进一步处理

bihw5rsg  于 2023-02-14  发布在  其他
关注(0)|答案(2)|浏览(124)

假设你在一个大的工作环境中工作,并且你不太适应你的环境变量,或者你有一些自动生成很多对象的进程。有没有一种方法可以扫描你的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)
bq3bfh9z

bq3bfh9z1#

使用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

slsn1g29

slsn1g292#

您可以将Filtermget中的inheritsls一起使用,以获得命名的list,在本例中为lm对象。

L <- Filter(\(x) inherits(x, "lm"), mget(ls()))
#L <- Filter(\(x) inherits(x, "lm") & !inherits(x, "glm"), mget(ls())) #In case glm need to be excluded

identical(unname(L), outList)
#[1] TRUE

lapply(L, plot)

相关问题