Обращение к глобальному пространству имён
-
- Активный участник
- Сообщения: 117
- Зарегистрирован: 31 окт 2011, 00:18
- Репутация: 14
- Откуда: Кривий Ріг
Обращение к глобальному пространству имён
У меня в рабочем пространстве содержится n-ое количество объектов (aa1, aa2, aa3, bb1, bb2 и т.д.). Все они - data.frame с одинаковой структурой (одинаковые названия полей). Мне нужно для одинаковых полей ОПРЕДЕЛЁННЫХ объектов рассчитать какое-либо значение (например - медиану). Цикл написать не сложно, но как мне обратиться к каждому объекту по номеру (или другому уникальному реквизиту) в глобальном пространстве имён? По хелпам функций ls() и ls.str() ничего подобного не заметил.
PS Объединять объекты мне не нужно - они будут храниться и обрабатываться по отдельности.
PS Объединять объекты мне не нужно - они будут храниться и обрабатываться по отдельности.
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Обращение к глобальному пространству имён
не очень понятно, о чем идет речь, и кто такое "пространство имен". И какие идентификаторы еще нужны кроме имен - имя и есть уникальный идентификатор.
немного повангую
- если нужно сконструировать символьные выражения, а потом их выполнять, для этого есть последовательность parse+eval:
- если речь идет об области видимости (например, нужно "достать" глобальную переменную из функции), то есть
немного повангую
- если нужно сконструировать символьные выражения, а потом их выполнять, для этого есть последовательность parse+eval:
Код: Выделить всё
eval(parse(text="foo<-c(1,2,3)"))
foo
[1] 1 2 3
Код: Выделить всё
assign("foo",c(1,2,3),envir=.GlobalEnv)
-
- Активный участник
- Сообщения: 117
- Зарегистрирован: 31 окт 2011, 00:18
- Репутация: 14
- Откуда: Кривий Ріг
Re: Обращение к глобальному пространству имён
Да, наверное я не совсем понятно выразился.
Функция ls() выдаёт мне список объектов в рабочем пространстве R. Среди прочих объектов в этом списке меня интересуют объекты data.frame, которые, например, занимают позиции в списке 12-52. И мне нужно "одним махом" перебрать определённые поля этих объектов, вычислить какую-либо функцию, и записать результаты в единый вектор (сколько объектов - столько записей в векторе).
Функция ls() выдаёт мне список объектов в рабочем пространстве R. Среди прочих объектов в этом списке меня интересуют объекты data.frame, которые, например, занимают позиции в списке 12-52. И мне нужно "одним махом" перебрать определённые поля этих объектов, вычислить какую-либо функцию, и записать результаты в единый вектор (сколько объектов - столько записей в векторе).
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Обращение к глобальному пространству имён
1) откуда вы узнаете номера? а если переменная добавится/удалится, и номера съедут? какая-то искуственная постановка. Если вы знаете имена, то ни ls(), ни какие-то номера вам не нужны, для обработки всех data.frame на букву "а" все равно нужно перебирать и тип проверять (используя class()).ymr3R9Jge писал(а):Да, наверное я не совсем понятно выразился.
Функция ls() выдаёт мне список объектов в рабочем пространстве R. Среди прочих объектов в этом списке меня интересуют объекты data.frame, которые, например, занимают позиции в списке 12-52. И мне нужно "одним махом" перебрать определённые поля этих объектов, вычислить какую-либо функцию, и записать результаты в единый вектор (сколько объектов - столько записей в векторе).
2) цикл обработки все равно нужен, явный или неявный (типа tapply(), примененного к списку имен). И будет вам вектор в результате, а сами выражения можете конструировать из имен, используя parse+eval
-
- Интересующийся
- Сообщения: 40
- Зарегистрирован: 11 авг 2011, 13:23
- Репутация: 15
Re: Обращение к глобальному пространству имён
Я здесть, что-то такое уже писал.
Могу предложить следующий вариант:
В этом случае вызов get(names[1]) -- равносильно прямому бращению к этому объектц из среды R.
Понятно, что если в рабочем пространстве есть не только искомые датафреймы, но и другие объекты, то нужно ввести дополнительные условия.
Может быть не совсем красиво, но такие задачи я решал именно так.
Надеюсь поможет!!!
Могу предложить следующий вариант:
Код: Выделить всё
names=ls()
get(names[x])
Понятно, что если в рабочем пространстве есть не только искомые датафреймы, но и другие объекты, то нужно ввести дополнительные условия.
Может быть не совсем красиво, но такие задачи я решал именно так.
Надеюсь поможет!!!
-
- Активный участник
- Сообщения: 117
- Зарегистрирован: 31 окт 2011, 00:18
- Репутация: 14
- Откуда: Кривий Ріг
Re: Обращение к глобальному пространству имён
Извиняюсь за запоздалый ответ...
В самое яблочко!!! Вот мой конечный вариант последовательности действий (нас интересует вычисление медиан по столбцам dlina в таблицах данных):Иван Стрельников писал(а):Могу предложить следующий вариант:Код: Выделить всё
names=ls() get(names[x])
Код: Выделить всё
>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)}#последовательно записываем значения медиан в подготовленный пустой вектор
-
- Гуру
- Сообщения: 4056
- Зарегистрирован: 15 окт 2010, 08:33
- Репутация: 1054
- Ваше звание: программист
- Откуда: Казань
Re: Обращение к глобальному пространству имён
как я уже докладывал, это крайне опасный способ - порядковые номера ни разу не идентификаторы, поправите однажды код, создадите переменную на букву "а", и все сдвинется. И потом человек долго дивится, почему все работать перестало. Да и смысл такого подхода непонятен - если номера известны, значит и имена известны. Кто мешает сразу имена использовать? а если нужны имена по определенной маске, то кто мешает использовать paste() для генерации имен или match(), pmatch() и charmatch() для поиска имен по (частичному) совпадению ...ymr3R9Jge писал(а):>name_table<- name_table[15:187]#оставляем в векторе названия только нужных нам таблиц
Кто сейчас на конференции
Сейчас этот форум просматривают: нет зарегистрированных пользователей и 16 гостей