如何在尚未导出的 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}
最终用户应该使用 main 函数:
result1 <- mainfunction1(param1, param2, auxiliaryfunction1)
问题是当构建包时,它永远找不到辅助函数,除非它们被导出,但是我希望它们对最终用户不可用,或者至少避免用户覆盖它们的问题错误地引用了包命名空间。
我该怎么做?
辅助函数也要导出吗?
您正在尝试解决 non-problem。
如果您希望用户使用某个功能,请将其导出。
如果您不想让用户使用某项功能,请不要导出它。
也就是说...
您可能正在了解如何将函数作为参数传递给其他函数。函数是 R 中的第一个 class 对象,因此它们可以很容易地传递。考虑以下示例:
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
我正在构建一个包含许多辅助功能的简单 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)
问题是当构建包时,它永远找不到辅助函数,除非它们被导出,但是我希望它们对最终用户不可用,或者至少避免用户覆盖它们的问题错误地引用了包命名空间。
我该怎么做? 辅助函数也要导出吗?
您正在尝试解决 non-problem。
如果您希望用户使用某个功能,请将其导出。
如果您不想让用户使用某项功能,请不要导出它。
也就是说...
您可能正在了解如何将函数作为参数传递给其他函数。函数是 R 中的第一个 class 对象,因此它们可以很容易地传递。考虑以下示例:
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