【问题标题】:How can I use a function inside an R package that has not be exported?如何在尚未导出的 R 包中使用函数?
【发布时间】:2016-04-17 07:57:30
【问题描述】:

我正在构建一个带有许多辅助功能的简单 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}

最终用户应该这样使用main函数:

result1 <- mainfunction1(param1, param2, auxiliaryfunction1)

问题是,当构建包时,它永远不会找到辅助函数,除非它们被导出,但是我希望它们对最终用户不可用,或者至少避免用户错误地覆盖它们的问题通过引用包命名空间。

我该怎么做? 我也应该导出辅助功能吗?

【问题讨论】:

    标签: r namespaces package roxygen2


    【解决方案1】:

    你正在尝试解决一个非问题。

    如果您希望用户使用某个功能,请将其导出。

    如果您不希望用户使用某个功能,请不要将其导出。

    也就是说……

    您可能正在了解如何将函数作为参数传递给其他函数。函数是 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
    

    【讨论】:

    • 是的,但是用户应该能够通过传递辅助函数的名称来选择在主函数中使用哪个辅助函数..
    • @mickkk 那你还是需要导出辅助函数,或者使用switch()之类的语句。
    猜你喜欢
    • 2020-10-01
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2017-01-04
    • 2017-05-15
    • 1970-01-01
    • 2020-11-16
    • 2017-12-16
    相关资源
    最近更新 更多