2016-01-12 32 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