Функция скрывается в R - PullRequest
0 голосов
/ 24 июня 2018

Рассмотрим следующее 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 ]

0 голосов
/ 24 июня 2018

Чтобы инкапсулировать foo и bar, вам нужно реализовать class. На мой взгляд, самый простой способ сделать это в R - через R6classes: https://cran.r -project.org / web / packages / R6 / vignettes / Введение.html # private-members . Там у вас есть пример того, как скрыть функцию length.

0 голосов
/ 24 июня 2018

Этого можно добиться, установив среду привязки вашей функции 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()
0 голосов
/ 24 июня 2018

Моя рекомендация - использовать пакеты. Они были созданы для таких ситуаций. Но все же вы не можете скрыть сами функции в чистом виде.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...