Как добавить неэкспортированные функции в пакет R

Я работаю над R Package с несколькими функциями, которые я использую в одной экспортируемой функции.

У меня вопрос, возможно глупый, куда мне девать все эти неэкспортированные функции? Или как я могу сделать это возможным?

Я не хочу, чтобы пользователь мог получить доступ к этим функциям из каталога R/.

Вот моя фиктивная функция, использующая неэкспортированную функцию add:

my_func <- function(x, y){
   result <- exp(add(x, y))
   return(result)
   }

А вот и моя фиктивная функция add, которую я не хочу экспортировать:

add <- function(x, y) {
 result <- x + y
 return(result)
}

Спасибо

РЕДАКТИРОВАТЬ

Если я помещу все функции в /R, они будут видны пользователю. Например, generate.cv.folds из пакета xgboost не экспортируется, но вы все еще можете получить к нему доступ с помощью xgboost:::generate.cv.folds, и я хочу сделать то же самое.


person patL    schedule 15.11.2017    source источник
comment
Вы должны явно экспортировать все функции (в /R), к которым вы хотите, чтобы пользователь имел прямой доступ (через механизм ::). Все неявно экспортированные функции не экспортируются и доступны только через :::. Вы не можете скрыть код (извините?).   -  person Roman Luštrik    schedule 15.11.2017
comment
@RomanLuštrik, но где (или как) я могу поместить эти неявно экспортированные функции? Я знаю, что любой пользователь может получить доступ к любым функциям с помощью package:::function, но я не хочу, чтобы они были видны в /R. Спасибо.   -  person patL    schedule 15.11.2017
comment
Ваш код R должен быть в /R, насколько я знаю. По крайней мере, если вы хотите полноценный пакет.   -  person Roman Luštrik    schedule 15.11.2017


Ответы (2)


R не предоставляет инфраструктуры для сокрытия исходного кода[1]. Это противоречит ценностям и пожеланиям разработчиков R.

Итак, то, что вы хотите сделать, невозможно с R.

[1] http://r.789695.n4.nabble.com/how-to-hide-code-of-any-function-td4474822.html

person Roland    schedule 15.11.2017
comment
Я не хочу ничего скрывать. Я просто хочу не экспортировать функцию в мой R/. Смотрите редактирование в посте. Я просто хочу сделать что-то подобное. Кроме того, я против частного исходного кода, так как хочу, чтобы пользователи им пользовались. - person patL; 15.11.2017
comment
Я не уверен, что вы спрашиваете тогда. Если функция экспортируется, она указывается в файле NAMESPACE, как описано в руководстве по написанию расширений R. Неправда, что функции, определенные в каталоге /R, экспортируются автоматически. - person Roland; 15.11.2017
comment
Спасибо @Роланд! Наверное, я путаю термины. Вы видели часть редактирования, когда я привожу пример невидимой функции? Функция generate.cv.folds из xgboost не видна в R/ (как вы можете видеть в xgboost GitHub ), но его нет в каталоге Xgboost GitHUb R/. - person patL; 15.11.2017
comment
Я думаю, вы просто не понимаете, как работает файл NAMESPACE. generate.cv.folds туда не экспортируется: github.com/dmlc/xgboost/blob/ master/R-package/NAMESPACE - person Roland; 15.11.2017
comment
Я вижу сейчас!! Спасибо @Роланд! Это действительно помогает мне. - person patL; 15.11.2017
comment
Это проблема. Я не понимал, как работает NAMESPACE, но теперь вроде понимаю. Спасибо @Роланд - person patL; 15.11.2017
comment
вроде часто не хватает. Я рекомендую вам изучить Написание расширений R . - person Roland; 15.11.2017

Экспортировать/не экспортировать функцию так же просто, как добавить одну строку в документацию функции. Я предполагаю, что вы используете roxygen2 для документирования вашего пакета.

Экспортировано:

#' Add two numeric values
#'
#' This function returns the sum of two values.
#' @param x,y Numeric values.
#' @return Numeric.
#' @export
add1 <- function(x, y) {
 result <- x + y
 return(result)
}

Не экспортируется:

#' Add two numeric values.
#'
#' This function returns the sum of two values.
#' @param x,y Numeric values.
#' @return Numeric.
add2 <- function(x, y) {
 result <- x + y
 return(result)
}

Обратите внимание на отсутствующий @export в конце документации. Когда вы создаете документацию, файл NAMESPACE будет выглядеть так:

export(add1)

но в нем не будет записи для add2.

person Eden    schedule 03.09.2020