在函数 R 中需要包

Requiring packages inside a function R

我有一个问题,我正在用 R 制作一个包(专为我)。

所以我正在编写函数 sets 并且在 sets 内部我使用了很多 dplyr 函数。

如果你要使用我的包裹,我该怎么做,你必须有 dplyr

我觉得是with require()里面的函数?我在阅读有关此功能的内容时感到更加困惑。

我想它应该是这样的:

sets <- function(base, start, end, f_hor, freq=12){
  require(dplyr, lubridate)
  train <- base %>% 
    filter(year(date)>=as.Date(start)) %>% 
    filter(year(date)<=as.Date(end)) %>% select(-date)
  
  train <- ts(train, 
              start=c(year(as.Date(start)),month(as.Date(start))),
              end=c(year(as.Date(end)),month(as.Date(end))),
              frequency = freq)

  test <- base %>% 
    filter(year(date)<as.Date(end)) %>% select(-date)
  
  test <- head(test, f_hor)
  
  list <- list(train, test)
  names(list) <- c("train", "test")
  return(list)
}

我说得对吗?

提前致谢!

您可能希望使用 @import 标记将其包含在函数顶部的 roxygen 框架中。您也可以考虑使用 @importFrom

类似于:

#' My function called sets
#'
#' @param base ...
#' @param start
#' @param end
#' @param f_hor
#' @param freq
#'
#' @return a list...
#' 
#' @import dplyr
#' @import lubridate
#' @importFrom lubridate year month
#' 
#' @export
sets <- function(base, start, end, f_hor, freq = 12){
  
}

此外,在您的函数中,您可以选择显式调用特定包中的函数,即:

sets <- function(base, start, end, f_hor, freq = 12){
  train <- base %>% 
    dplyr::filter(lubridate::year(date)>=as.Date(start)) %>% 
    dplyr::filter(lubridate::year(date)<=as.Date(end)) %>% select(-date)
}

如果您使用的是 Roxygen,请按照@Matt 的说明进行操作。如果你不是,那么你需要这样做:在 DESCRIPTION 文件的 Imports: 列表中列出你想要的包,例如

Imports:  lubridate, dplyr

这保证您的包不会在没有这两个包可用的情况下加载。

您还需要执行以下操作之一:

在您的 NAMESPACE 文件中列出导入的函数,例如

importFrom(lubridate, year, month)

然后就像它们是本地定义的一样使用它们,或者每次调用它们时都使用 :: 前缀,例如

lubridate::year(date)

我不确定这两个步骤如何对应 Roxygen 标签。