Подтвердить что ты не робот

Петля через ls() или объекты()?

Быстрый вопрос... есть ли в любом случае я могу прокрутить какой-то набор объектов и применить функцию к каждому?

Когда я набираю ls() или objects(), он возвращает список имен объектов. Я мог бы пропустить этот список, идентифицировать те, которые data.frame, а затем запустить функцию против каждого объекта.

Как передать элемент из ls или objects через функцию?

Извиняется, если это кажется глупым вопросом...

Спасибо!

4b9b3361

Ответ 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"