2016-01-12 4 views
1

Я строю простой пакет R с множеством вспомогательных функций. Одна из основных функций использует много вспомогательных из них, как, например:Как я могу использовать функцию внутри R-пакета, который не был экспортирован?

.... 
#'@ description 
#'@ param 
#'@ export 
... 
mainfunction1 <- function(param1,...,auxiliaryfunction){ 
# Do some stuff 
b <- auxiliaryfunction(param2) + c 
return(b) 
} 

... 
#'@ description 
#'@ param 
auxiliaryfunction1 <- function(param5,param6,...){# do stuff} 

Основная функция должна использоваться конечным пользователем, как например:

result1 <- mainfunction1(param1, param2, auxiliaryfunction1) 

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

Как это сделать? Должен ли я экспортировать вспомогательные функции?

ответ

2

Вы пытаетесь решить проблему без проблем.

Если вы хотите, чтобы пользователь использовал функцию, экспортируйте ее.

Если вы не хотите, чтобы пользователь пользовался функцией, не экспортируйте его.

Это говорит ...

Существует вероятность того, что вы попасться о том, как функции передаются в качестве аргументов других функций. Функции являются объектами первого класса в R, поэтому их можно легко передавать. Рассмотрим следующий пример:

m <- function(x, y) x + y 
n <- function(x, y) x - y 
k1 <- function(x, y, FUN) FUN(x, y) 
k1(10, 5, FUN = m) 
# [1] 15 
k1(10, 5, FUN = n) 
# [1] 5 

k2 <- function(x, y, FUN = m) FUN(x, y) 
k2(10, 5) # uses `m()` by default 
# [1] 15 
k2(10, 5, FUN = m) 
# [1] 15 
k2(10, 5, FUN = n) 
# [1] 5 

Если вы действительно не хотите, чтобы пользователям доступ к функциям непосредственно, но хотят, чтобы дать им выбор, по которому использовать, а затем определить вспомогательные функции в теле основной функции и использовать, например, switch() выбирать между ними:

fun <- function(x, method = c("A", "B")) { 
    m <- match.arg(method) 
    a <- function(x) x^2 
    b <- function(x) sqrt(x) 
    switch(m, A = a(x), B = b(x)) 
} 
fun(2) 
# [1] 4 
fun(2, "A") 
# [1] 4 
fun(2, "B") 
# [1] 1.414214 
+0

Да, но пользователь должен иметь возможность выбрать, пропускание имени вспомогательной функции, вспомогательные функции для использования в основной функции .. – mickkk

+0

@mickkk Затем вам все равно нужно экспортировать вспомогательные функции или использовать инструкцию 'switch()'. – Thomas

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

  • Нет связанных вопросов^_^