r - 创建的包未从 NAMESPACE 文件中导入的包中运行函数
问题描述
这是我的第一个包裹。这是我的 .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)
除了其他必需的部分,我的说明文件有这个:
Imports:
labelled,
readxl,
tidyverse
有人可以帮忙吗?
解决方案
tidyverse
从Imports
内移到内Depends
会DESCRIPTION
使其工作,但如果您正在开发正式的包,则不推荐使用这种方法。就像@Bruno 评论的那样:
> 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
将其放入其中不起作用的原因是,仅将列出的包导出的变量放在搜索路径上,如编写 R 扩展的包命名空间部分所述:
只有导出的变量被放置在附加的框架中。加载从其他包导入变量的包也会导致这些其他包也被加载(除非它们已经被加载),但它们不会被这些隐式加载放在搜索路径上。因此包中的代码只能依赖于它自己的命名空间中的对象,并且它的导入(包括基本命名空间)是可见的
tidyverse
,作为一个元包,不导出其包含的包的功能,而是使用.onAttach
钩子来附加这些包(详见tidyverse:::.onAttach
)。这意味着如果tidyverse
使用上述方法导入,则此钩子将不会运行,并且其他包导出的变量不会添加到搜索路径中,这就是您无法访问它们的原因。
放在tidyverse
下面Depends
确实会运行.onAttach
钩子,因此也附加了其他包。
推荐阅读
- symfony - Symfony | 表格 | 自引用 CollectionType 字段 - 错误:内存不足
- python - 如何使用 matplotlib 在 Python 3 中操作数据?
- ruby-on-rails - 耙任务以发送电子邮件。我需要排队吗?
- html - 元素超出父级
- python-3.x - tesseract ocr 不适用于文本长度仅为 2 或更少的图像。适用于文本长度大于 3 的图像
- php - 获得祖父母,曾祖父母等的口才关系
- android - 将 React-Native 的 Android 项目导入 Android Studio
- android - 在不破坏布局约束的情况下实现动画
- python - TensorFlow:Softmax 应用于每个条目
- c# - XML上的Linq从select中的嵌套元素中获取值