Функция скрывается в R
Рассмотрим следующее file.r
:
foo = function(){}
bar = function(){}
useful = function() {foo(); bar()}
foo
а также bar
предназначены только для внутреннего использования useful
- они вообще не пригодны для повторного использования, потому что они требуют очень конкретной компоновки данных, имеют встроенные константы, делают что-то неясное, что никому не понадобится и т. д.
Я не хочу определять их внутри useful{}
, потому что тогда он станет слишком длинным (>10 LOC).
Клиент может сделать следующее только для импорта useful
в их пространстве имен, и все же я не уверен, будет ли это работать с foo
а также bar
внешняя видимость:
# Source a single function from a source file.
# Example use
# max.a.posteriori <- source1( "file.r","useful" )
source1 <- function( path, fun )
{
source( path, local=TRUE )
get( fun )
}
Как я могу правильно сделать это на file.r
сторона т.е. экспортировать только определенные функции?
Кроме того, существует проблема упорядочения функций, которая, как мне кажется, связана с вышеизложенным. Дайте нам
douglas = function() { adams() }
adams = function() { douglas() }
Как мне обрабатывать циклические зависимости?
3 ответа
Вы можете добиться этого, установив обязательную среду вашего useful
функция, как в коде, указанном ниже. Это похоже на то, что делают пакеты, и если ваш проект становится больше, я бы порекомендовал создать пакет, используя devtools
пакет.
Если функции foo
а также bar
не используются другими функциями, я бы просто определить их внутри useful
, Поскольку функции являются довольно независимыми частями кода, это не делает код более сложным для понимания, даже если счетчик строк useful
увеличивается. (За исключением, конечно, если по каким-то правилам вас заставляют сокращать количество строк.)
Для получения дополнительной информации о средах см.: http://adv-r.had.co.nz/Environments.html
# define new environment
myenv <- new.env()
# define functions in this environment
myenv$foo <- function(){}
myenv$bar <- function(){}
# define useful in global environment
useful <- function(){
foo()
bar()
}
# useful does not find the called functions so far
useful()
# neither can they be found in the globalenv
foo()
# but of course in myenv
myenv$foo()
# set the binding environment of useful to myenv
environment(useful) <- myenv
# everything works now
useful()
foo()
Я рекомендую использовать пакеты. Они были созданы для таких ситуаций. Но все же вы не можете скрыть сами функции в чистом R.
Для того, чтобы инкапсулировать foo и bar, вам необходимо реализовать class
, На мой взгляд, проще всего сделать это в R через R6classes
: https://cran.r-project.org/web/packages/R6/vignettes/Introduction.html. Там у вас есть пример того, как скрыть length
функция.