繁体   English   中英

如何使用R包中尚未导出的函数?

[英]How can I use a function inside an R package that has not be exported?

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

问题是,在构建软件包时,除非导出了辅助功能,否则它不会找到辅助功能,但是我希望最终用户无法使用这些辅助功能,或者至少要避免用户通过引用错误地覆盖辅助功能的问题。包名称空间。

我怎样才能做到这一点? 我也应该导出辅助功能吗?

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

如果要用户使用功能,请导出它。

如果您不希望用户使用功能,请不要导出它。

那个...

您可能会陷入如何将函数作为参数传递给其他函数的问题。 函数是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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM