Определить все объекты данного класса для дальнейшей обработки - PullRequest
10 голосов
/ 01 марта 2011

Предположим, вы работаете с большой рабочей средой и не очень хорошо справляетесь с переменными среды, или у вас есть какой-то процесс, который автоматически генерирует много объектов. Есть ли способ сканировать ваш 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 Ответ

14 голосов
/ 01 марта 2011

Используйте функцию 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 любым способом, каким захотите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...