Функция скрывается в 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 функция.

Другие вопросы по тегам