从 NAMESPACE 文件中导入的包创建的包不是 运行 函数

Created package not running functions from imported packages in NAMESPACE file

这是我的第一个包裹。这是我的 .R 文件的运行方式,有 3 个函数,其中两个要导出。它们的实际内容并不重要,只是它使用了很多 tidyverse 功能。

#' @import tidyverse
#' @importFrom labelled set_variable_labels var_label
#' @importFrom readxl read_excel cell_cols

NULL

#' Carregando dados brutos
#'
#' @param diretorio_dados Diretório onde os microdados originais em formato de texto estão armazenados
#'
#' @param diretorio_dicionario Diretório onde o dicionário da pesquisa em formato xls está armaezenado
#'
#' @param ... vetores com datas das pesquisas de interesse no  formato \code{c('trimestre', 'ano')}
#'
#' @return Lista de dataframes, sendo cada entrada um trimestre/ano em \code{...}
#' @encoding UTF-8
#' @export
#'
#' @examples
#' datazoom_pnadc('./Desktop', './Desktop', c(1, 2000), c(2, 2000))
#'
datazoom_pnadc <- function(diretorio_dados,
                           diretorio_dicionario,
                           ...) {


  return(NULL)
}

 #' Painel básico
 #'
 #' @param build_data Default \code{TRUE}.
 #' Se \code{TRUE}, implementa primeiro \code{\link{datazoom_pnadc}} e depois
 #' monta paineis de indivíduos. Se \code{FALSE}, a função constrói paneis a partir de dados já carregados no R
 #'
 #' @param dados_prontos Bases de dados para diferentes trimestres da PNAD contínua.
 #' Necessário se \code{build_data = FALSE}
 #'
 #' @param local_dados Diretório onde os microdados originais em formato de texto estão armazenados
 #' caso \code{build_data = TRUE}
 #'
 #' @param local_dicionarios Diretório onde o dicionário da pesquisa em formato xls está armaezenado caso
 #' \code{build_data = TRUE}
 #'
 #' @param periodos Lista de vetores com períodos de interesse no formato
 #' \code{periodos = list(c(trimestre1, ano1), c(trimestre2, ano2), ...)}
 #'
 #' @encoding UTF-8
 #'
 #' @return Lista de dataframes, sendo cada entrada um trimestre/ano
 #'
 #' @examples
 #' PNADC_2012 <- datazoom_pnadc(diretorio_dados = './Desktop',
 #' diretorio_dicionario = './pnadcontinua/Desktop',
 #' c(1,2012), c(2,2012))
 #'
 #' teste <- pnadc_painel_basico(build_data = FALSE,
 #'                              dados_prontos = PNADC_2012)
 #'
 #' teste2 <- pnadc_painel_basico(build_data = TRUE,
 #'                               local_dados = './pnadcontinua',
 #'                               local_dicionario = './pnadcontinua/Dicionario_e_input',
 #'                               periodos = list(c(1,2012), c(2,2012)))
 #' @export
pnadc_painel_basico <- function(build_data = TRUE, ...){
    return(NULL)

}

出于某种原因,即使在 运行 宁 devtools::document() 并且在我的 NAMESPACE 文件中有这个:

# Generated by roxygen2: do not edit by hand

export(datazoom_pnadc)
export(pnadc_painel_basico)
import(tidyverse)
importFrom(labelled,set_variable_labels)
importFrom(labelled,var_label)
importFrom(readxl,cell_cols)
importFrom(readxl,read_excel)

如果我没有预先设置 library(tidyverse)library(labelled)library(readxl),则安装和加载后包中的功能不会 运行。

除其他必需部分外,我的 DESCRIPTION 文件包含以下内容:

Imports: 
    labelled,
    readxl,
    tidyverse

有人可以帮忙吗?

tidyverseImports 移动到 DESCRIPTION 中的 Depends 会使其工作,但如果您正在开发正式包,则不推荐使用这种方法。喜欢@B运行o 评论:

> usethis::use_package("tidyverse")
Error: 'tidyverse' is a meta-package and it is rarely a good idea to
depend on it. Please determine the specific underlying package(s) that
offer the function(s) you need and depend on that instead. For data 
analysis projects that use a package structure but do not implement a
formal R package, adding 'tidyverse' to Depends is a reasonable 
compromise. Call `use_package("tidyverse", type = "depends")` to achieve
this.

将它放在 Imports 中不起作用的原因是只有列出的包导出的变量才放在搜索路径中,如 Package namespaces of Writing R Extensions:[=25 部分所述=]

Only the exported variables are placed in the attached frame. Loading a package that imports variables from other packages will cause these other packages to be loaded as well (unless they have already been loaded), but they will not be placed on the search path by these implicit loads. Thus code in the package can only depend on objects in its own namespace and its imports (including the base namespace) being visible

tidyverse,作为元包,不导出其包含包的功能,而是使用.onAttach挂钩附加这些包(详情见tidyverse:::.onAttach) .这意味着如果使用上述方法导入 tidyverse 则此钩子将不会 运行 并且其他包导出的变量将不会添加到搜索路径中,这就是您无法访问它们的原因.

tidyverse 放在 Depends 下会 运行 .onAttach 挂钩,因此其他包也会被附加。