2016-10-16 1 views
1

Я поиске Util функций в сфере производства в окружающую среду для инкапсуляции (и группы) функции помощника:Загрузить библиотеку в существующую среду (эквивалентно «локальному» параметру «источник»)?

Helper файл:

# File: Helper.R 
hello <- function() { 
    print("Hello world") 
} 

Клиент:

helper <- new.env() 
source("Helper.R", local=helper) 
helper$hello() # call the helper function 

Как Перенести sourced «Helper.R» в библиотеку, не нарушая призовы к исходным функциям?

То, что я хочу что-то вроде

helper <- new.env() 
library(Helper, local=helper) 
helper$hello() # call the helper function (loaded from the library now) 

Есть ли способ сделать это?

+0

Другим способом будет источник в пространство имен (вместо среды) и использовать '::' вместо '$', но вопрос для этого не имеет насыщающего ответа: http://stackoverflow.com/q/ 15620404/4468078 –

ответ

1

Вы можете использовать import_package функцию в ‹modules› package (не один на CRAN, это разные!).

Тогда следующий прикрепляет пакет локально:

modules::import_packge('pkg', attach = TRUE) 

В качестве альтернативы, и, возможно, ближе к тому, что вы на самом деле хотите сделать, вы можете использовать его следующим образом:

pgk = modules::import_package('pkg') 

Теперь пакет не прилагается вообще, и к его экспортированным объектам можно получить доступ через pkg$obj. Это несколько похоже на функцию loadNamespace базы R, но значительно больше за кулисами.

Наконец, рассмотрите возможность не помещать ваш код-помощник в пакет вообще, а скорее распределите его как модуль . Это все-таки то, для чего был разработан пакет . Таким образом, вместо того, чтобы создать пакет, просто распространять helper.r кода файл (или папку), а затем использовать его следующим образом:

helper = modules::import('helper') 

Смотрите пакет README и виньетка для подробного описания.

+0

Отличный пакет, особенно. функция, позволяющая использовать комментарии к функциям в виде справки (что 'source' не может сделать). Я надеюсь, что пакет 'modules' скоро найдет свой путь в CRAN –

0

Другим способом может быть:

# getNamespace returns the environment representing the name space name. The namespace is loaded if necessary. 
# Internal function to support reflection on namespace objects! 
env <- getNamespace("data.table") 
cars <- env$as.data.table(mtcars) 

Этого пример делает все объекты пакета data.table доступных через переменные окружения env.

Примечание: В нем используется внутренняя функция R (неважно, большой риск изменений действительно есть).

0

Я нашел другой пакет под названием import (по аналогии с "модули"), что позволяет импортировать пакеты в окружающую среду:

https://github.com/smbache/import

Этот пакет также находится на CRAN:

install.packages("import") 

Он позволяет импортировать выбранные, все экспортированные («общедоступные») или все (даже не экспортируемые) функции пакета.

Пример:

import::from(dplyr, arrange, .into = "datatools") 

import::from функция является удобной оболочкой вокруг getExportedValue.

1

Внесение в список предложений, которые вы также можете рассмотреть, использовать пакет modules на CRAN (обратите внимание, что я являюсь автором). Если у вас есть свой Helper.R файл:

hello <- function() { 
    print("Hello world") 
} 

вы можете использовать

helper <- modules::use("Helper.R") 
helper$hello() 

инкапсулировать свои вспомогательные функции в их собственной среде. Пакет также предоставляет некоторые функции для управления локальным пространством имен модуля (импорт/экспорт).

Смежные вопросы