2016-10-08 2 views
1

У меня есть пакет, который генерирует некоторые функции при вызове функции initialize. Я создаю эти функции в parent.frameinitialize(), что, я думаю, является глобальной средой. Я хочу эмулировать нормальное поведение пакета, которое позволяет вам напрямую вызывать функцию из пакета после ее загрузки, но без необходимости видеть эти функции при перечислении содержимого рабочей области с помощью ls(). Например, делаявыставляющие функции без помех ls()

library(ggplot2) 
ls() 

не возвращает geom_line, geom_point и т.д., но вы не должны использовать :: для вызова этих функций. Они подвергаются воздействию пользователя, но не живут в глобальной среде.

Есть ли у меня умный способ сделать то же самое для функций, генерируемых вызовом initialize, например. определяя среды или пространства имен в zzz.r и onLoad или onAttach крючками? Я думал о попытке установить среды функций в пространство имен пакетов, но кажется, что вы не можете изменить пространство имен пакетов после его загрузки.

EDIT пакет, над которым я работаю, находится здесь: https://github.com/mkoohafkan/arcpyr. Функция arcpy.initialize подключается к Python с использованием PythonInR, импортирует пакет arcpy, а затем создает интерфейсы для списка функций. Сегодня я попытаюсь создать упрощенный фиктивный пакет.

+1

Конечно @ Hack-R, я редактировал свой вопрос со ссылкой. Сегодня я попытаюсь создать более простую версию. – mikeck

+1

Имена функций, начинающиеся с '.', Не будут отображаться с помощью 'ls()'. Не совсем «умный» и не очень безопасный, если другие пакеты используют один и тот же трюк. – Eric

+1

Зачем вам нужно динамически создавать эти функции? Почему бы им не существовать в пространстве имен вашего пакета, но попросите их выбросить ошибку, если Python еще не инициализирован? – shadowtalker

ответ

0

Поэтому я нашел решение, которое использует обе среды (спасибо @ssdecontrol!) И attach.

f = new.env()     # create the environment f 
assign("foo", "bar", pos = f) # create the variable foo inside f 
ls()       # lists f 
ls(f)       # lists foo 
attach(f)      # attach f to the current environment 
foo        # foo can now be accessed directly 
## bar 
ls()       # but still only shows f 
rm(f)       # can even remove f 
foo        # and foo is still accessible 
## bar 

Конечно, есть some risks с помощью attach.

Я redid в arcpyr пакет для использования среды вместо этого, но вы можете получить старое поведение назад, делая

arcpy = arcpy_env() 
attach(arcpy) 
Смежные вопросы