【问题标题】:no visible global function definition for ':='':=' 没有可见的全局函数定义
【发布时间】:2020-01-21 09:50:57
【问题描述】:

我正在编写一个使用 tidyeval 的包。因为我使用 tidyeval,所以我在描述文件的导入下列出了 rlang。

其中一个函数包含几行使用:=

像这样:

data %>%
    dplyr::mutate(
      !!New_R := AP_R_X*!!X + AP_R_Y*!!Y + AP_R_Z*!!Z,
      !!New_U := AP_U_X*!!X + AP_U_Y*!!Y + AP_U_Z*!!Z,
      !!New_F := AP_F_X*!!X + AP_F_Y*!!Y + AP_F_Z*!!Z) 

代码按预期工作,但在运行 devtools::check() 时我收到以下注释

 no visible global function definition for ':='

我怎样才能摆脱这个笔记?这不是 rlang 评估的一部分吗?


编辑: 我已经阅读了问题“no visible global function definition for ‘median’,尽管那里的答案解释了为什么会出现这样的问题。它没有解释为什么在我导入rlang 时没有定义:=。我已经编辑了这个问题以使其更多清除。

【问题讨论】:

  • 如果您使用 roxygen2,请添加 importFrom 语句。不确定这是来自 data.table 或 rlang 还是 dplyr 的 data.table 后端。
  • 不确定这个答案是否有帮助? stackoverflow.com/a/31132798/8506921
  • 我已加入 @NelsonGon 的投票以作为副本关闭。为了完全具体说明您的上下文,它来自rlang
  • 您的更新为我澄清了问题。您的问题是您在 DESCRIPTION 文件中 Import rlang,但您仍然需要 NAMESPACE 指令

标签: r tidyeval


【解决方案1】:

在您更新答案后,对我来说,这有点取决于它是否完全重复。这里唯一的区别是您在DESCRIPTION 中将rlang 添加到Imports 并且没有看到它与NAMESPACE 指令之间的区别。

我模拟了一个示例包以表明这还不够。首先,我设置了包:

library(devtools)
create("anExample", rstudio = FALSE, open = FALSE)

然后,我将https://dplyr.tidyverse.org/articles/programming.html 中的示例函数添加到文件R/my_mutate.R:

#' A function
#'
#' @param df A dataframe
#' @param expr A variable in the dataframe
#'
#' @return The dataframe with new mean and sum columns
#' @export
my_mutate <- function(df, expr) {
    expr <- enquo(expr)
    mean_name <- paste0("mean_", quo_name(expr))
    sum_name <- paste0("sum_", quo_name(expr))

    mutate(df,
           !! mean_name := mean(!! expr),
           !! sum_name := sum(!! expr)
    )
}

请注意,没有 roxygen2 命名空间标签。我确保在DESCRIPTION 中将rlang 和dplyr 添加到Imports 并运行devtools::document()。然后当我运行devtools::check() 时,我得到以下信息:

my_mutate: no visible global function definition for ‘enquo’
  my_mutate: no visible global function definition for ‘quo_name’
  my_mutate: no visible global function definition for ‘mutate’
  my_mutate: no visible global function definition for ‘:=’
  Undefined global functions or variables:
    := enquo mutate quo_name

0 errors ✔ | 1 warning ✖ | 1 note ✖

但是,如果我将 R/my_mutate.R 更改为以下内容:

#' A function
#'
#' @param df A dataframe
#' @param expr A variable in the dataframe
#'
#' @return The dataframe with new mean and sum columns
#' @importFrom dplyr mutate
#' @importFrom rlang enquo
#' @importFrom rlang quo_name
#' @importFrom rlang :=
#' @export
my_mutate <- function(df, expr) {
    expr <- enquo(expr)
    mean_name <- paste0("mean_", quo_name(expr))
    sum_name <- paste0("sum_", quo_name(expr))

    mutate(df,
           !! mean_name := mean(!! expr),
           !! sum_name := sum(!! expr)
    )
}

当我运行devtools::check()(在重新document()ing 之后)时,我没有收到该注释。

长话短说,Import in DESCRIPTION 是不够的。您还需要NAMESPACE 指令。

【讨论】:

  • 为了方便访问,请将您的所有@import 和@importFrom 说明放在R/anExample.R 的标题中。请参阅第 10.6 节记录包 -- r-pkgs.org/man.html
猜你喜欢
  • 2020-11-18
  • 2015-11-11
  • 2015-09-16
  • 2015-03-17
  • 1970-01-01
  • 2015-08-12
  • 2021-08-24
  • 1970-01-01
相关资源
最近更新 更多