Петля через ls() или объекты()?
Быстрый вопрос... есть ли в любом случае я могу прокрутить какой-то набор объектов и применить функцию к каждому?
Когда я набираю ls()
или objects()
, он возвращает список имен объектов. Я мог бы пропустить этот список, идентифицировать те, которые data.frame
, а затем запустить функцию против каждого объекта.
Как передать элемент из ls
или objects
через функцию?
Извиняется, если это кажется глупым вопросом...
Спасибо!
Ответы
Ответ 1
Ответ, данный @jverzani о том, какие объекты представляют собой кадры данных, хорош. Поэтому начнем с этого. Но мы хотим выбрать только элементы, которые являются data.frames. Таким образом, мы могли бы сделать это следующим образом:
#test data
df <- data.frame(a=1:10, b=11:20)
df2 <- data.frame(a=2:4, b=4:6)
notDf <- 1
dfs <- ls()[sapply(mget(ls(), .GlobalEnv), is.data.frame)]
имена фреймов данных теперь строятся в объекте dfs, поэтому вы можете передать их другим функциям:
sapply( dfs, function(x) str( get( x ) ) )
Я использовал команду get()
, чтобы получить объект по имени (подробнее об этом см. R FAQ)
Я ответил на ваш вопрос выше, но у меня есть подозрение, что если бы вы упорядочили свои фреймы данных в элементах списка, ваш код был бы намного более читабельным и простым в обслуживании. Очевидно, я не могу сказать это с уверенностью, но я не могу придумать вариант использования, где итерация по всем объектам, ищущим кадры данных, превосходит ваши кадры данных в списке, а затем вызывает каждый элемент в этом списке.
Ответ 2
Вы можете получить объект от его имени с помощью get или mget и выполнить итерацию с помощью одной из функций типа приложения. Например,
sapply(mget(ls(), .GlobalEnv), is.data.frame)
сообщит вам, какие элементы в глобальной среде представляют собой кадры данных. Чтобы использовать внутри функции, вы можете указать среду для вызова ls.
Ответ 3
Вы можете перемещать объекты в среде с помощью "eapply".
Ответ 4
Бросание в другое решение смеси с помощью inherits
. Он в основном (а) получает все объекты из текущей среды и (б) проверяет, наследуются ли они от фрейма данных.
sapply(sapply(ls(), get), inherits, 'data.frame')
Ответ 5
Вы можете использовать функцию get()
для ссылки на объект по имени
# Create some objects
df <- data.frame(a=1:10)
dl <- list(a=1, b=2, c=3)
# Use `ls()` to return a list of object names
lso <- ls()
# Use `get()` to refer to specific objects
class(get(lso[1]))
[1] "data.frame"
# Using an apply function to evaluate the class
lapply(lso, function(x) class(get(x)))
[[1]]
[1] "data.frame"
[[2]]
[1] "list"