Обращение к глобальному пространству имён

Вопросы по статистическому пакету R. Не обязательно гео.
Ответить
ymr3R9Jge
Активный участник
Сообщения: 117
Зарегистрирован: 31 окт 2011, 00:18
Репутация: 14
Откуда: Кривий Ріг

Обращение к глобальному пространству имён

Сообщение ymr3R9Jge » 25 дек 2013, 13:52

У меня в рабочем пространстве содержится n-ое количество объектов (aa1, aa2, aa3, bb1, bb2 и т.д.). Все они - data.frame с одинаковой структурой (одинаковые названия полей). Мне нужно для одинаковых полей ОПРЕДЕЛЁННЫХ объектов рассчитать какое-либо значение (например - медиану). Цикл написать не сложно, но как мне обратиться к каждому объекту по номеру (или другому уникальному реквизиту) в глобальном пространстве имён? По хелпам функций ls() и ls.str() ничего подобного не заметил.
PS Объединять объекты мне не нужно - они будут храниться и обрабатываться по отдельности.

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Обращение к глобальному пространству имён

Сообщение gamm » 25 дек 2013, 15:06

не очень понятно, о чем идет речь, и кто такое "пространство имен". И какие идентификаторы еще нужны кроме имен - имя и есть уникальный идентификатор.

немного повангую :D
- если нужно сконструировать символьные выражения, а потом их выполнять, для этого есть последовательность parse+eval:

Код: Выделить всё

eval(parse(text="foo<-c(1,2,3)"))
foo
[1] 1 2 3
- если речь идет об области видимости (например, нужно "достать" глобальную переменную из функции), то есть

Код: Выделить всё

assign("foo",c(1,2,3),envir=.GlobalEnv)

ymr3R9Jge
Активный участник
Сообщения: 117
Зарегистрирован: 31 окт 2011, 00:18
Репутация: 14
Откуда: Кривий Ріг

Re: Обращение к глобальному пространству имён

Сообщение ymr3R9Jge » 25 дек 2013, 15:19

Да, наверное я не совсем понятно выразился.
Функция ls() выдаёт мне список объектов в рабочем пространстве R. Среди прочих объектов в этом списке меня интересуют объекты data.frame, которые, например, занимают позиции в списке 12-52. И мне нужно "одним махом" перебрать определённые поля этих объектов, вычислить какую-либо функцию, и записать результаты в единый вектор (сколько объектов - столько записей в векторе).

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Обращение к глобальному пространству имён

Сообщение gamm » 25 дек 2013, 15:29

ymr3R9Jge писал(а):Да, наверное я не совсем понятно выразился.
Функция ls() выдаёт мне список объектов в рабочем пространстве R. Среди прочих объектов в этом списке меня интересуют объекты data.frame, которые, например, занимают позиции в списке 12-52. И мне нужно "одним махом" перебрать определённые поля этих объектов, вычислить какую-либо функцию, и записать результаты в единый вектор (сколько объектов - столько записей в векторе).
1) откуда вы узнаете номера? а если переменная добавится/удалится, и номера съедут? какая-то искуственная постановка. Если вы знаете имена, то ни ls(), ни какие-то номера вам не нужны, для обработки всех data.frame на букву "а" все равно нужно перебирать и тип проверять (используя class()).
2) цикл обработки все равно нужен, явный или неявный (типа tapply(), примененного к списку имен). И будет вам вектор в результате, а сами выражения можете конструировать из имен, используя parse+eval

Иван Стрельников
Интересующийся
Сообщения: 40
Зарегистрирован: 11 авг 2011, 13:23
Репутация: 15

Re: Обращение к глобальному пространству имён

Сообщение Иван Стрельников » 28 дек 2013, 06:18

Я здесть, что-то такое уже писал.
Могу предложить следующий вариант:

Код: Выделить всё

names=ls()
get(names[x])
В этом случае вызов get(names[1]) -- равносильно прямому бращению к этому объектц из среды R.
Понятно, что если в рабочем пространстве есть не только искомые датафреймы, но и другие объекты, то нужно ввести дополнительные условия.
Может быть не совсем красиво, но такие задачи я решал именно так.
Надеюсь поможет!!!

ymr3R9Jge
Активный участник
Сообщения: 117
Зарегистрирован: 31 окт 2011, 00:18
Репутация: 14
Откуда: Кривий Ріг

Re: Обращение к глобальному пространству имён

Сообщение ymr3R9Jge » 02 янв 2014, 21:05

Извиняюсь за запоздалый ответ...
Иван Стрельников писал(а):Могу предложить следующий вариант:

Код: Выделить всё

names=ls()
get(names[x])
В самое яблочко!!! Вот мой конечный вариант последовательности действий (нас интересует вычисление медиан по столбцам dlina в таблицах данных):

Код: Выделить всё

>name_table<- ls()#создаём вектор с названиями таблиц
>name_table<- name_table[15:187]#оставляем в векторе названия только нужных нам таблиц
>table_median<- rep(NA, length(name_table)#создаём пустой вектор для заполнения медианами
>for (i in 1:length(name_table)){#начинаем цикл
+ name_median[i]<- median(get(name_table[i]$dlina)}#последовательно записываем значения медиан в подготовленный пустой вектор

gamm
Гуру
Сообщения: 4056
Зарегистрирован: 15 окт 2010, 08:33
Репутация: 1054
Ваше звание: программист
Откуда: Казань

Re: Обращение к глобальному пространству имён

Сообщение gamm » 03 янв 2014, 04:06

ymr3R9Jge писал(а):>name_table<- name_table[15:187]#оставляем в векторе названия только нужных нам таблиц
как я уже докладывал, это крайне опасный способ - порядковые номера ни разу не идентификаторы, поправите однажды код, создадите переменную на букву "а", и все сдвинется. И потом человек долго дивится, почему все работать перестало. Да и смысл такого подхода непонятен - если номера известны, значит и имена известны. Кто мешает сразу имена использовать? а если нужны имена по определенной маске, то кто мешает использовать paste() для генерации имен или match(), pmatch() и charmatch() для поиска имен по (частичному) совпадению ...

Ответить

Вернуться в «R»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 16 гостей