':=' 没有可见的全局函数定义

Ste*_*ted 13 r tidyeval

我正在编写一个使用 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) 
Run Code Online (Sandbox Code Playgroud)

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

 no visible global function definition for ':='
Run Code Online (Sandbox Code Playgroud)

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


编辑:我已经阅读了问题“没有可见的 'median' 全局函数定义,尽管那里的答案解释了为什么会出现这样的问题。它没有解释为什么:=在我导入时没有定义rlang。我已经编辑了这个问题来制作这个更清楚。

duc*_*ayr 20

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

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

library(devtools)
create("anExample", rstudio = FALSE, open = FALSE)
Run Code Online (Sandbox Code Playgroud)

然后,我将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)
    )
}
Run Code Online (Sandbox Code Playgroud)

注意没有roxygen2命名空间标签。我一定要添加rlang,并dplyrImportsDESCRIPTION和运行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 ?
Run Code Online (Sandbox Code Playgroud)

但是,如果我更改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)
    )
}
Run Code Online (Sandbox Code Playgroud)

当我跑步时devtools::check()(重新启动后document()),我没有得到那个提示。

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


mfg*_*3z0 5

2023 年 6 月更新

你应该跑usethis::use_import_from("rlang", ":=")

usethis::use_import_from("rlang", ":=")将使用包级文档中的标签导入该:=函数。有关更多信息,请查看此处的文档rlang@importFrom

这会将您的包级文档更改为如下所示:

@keywords internal
"_PACKAGE"

## usethis namespace: start
#' @importFrom rlang :=
## usethis namespace: end
NULL
Run Code Online (Sandbox Code Playgroud)

在此处和此处的 R 包书籍中阅读有关此文档的更多信息。

如果您想使用更多tidy-eval函数rlang,您应该使用 导入它们usethis::use_import_from()

usethis::use_tidy_eval已被标记为已失效,usethis 2.2.0因为它导入并重新导出了不必要的功能(请参阅此处的问题此处的发行说明)

较旧的更新(2023 年 3 月)

我想添加截至 2023 年的更新 - 您现在可以运行usethis::use_tidy_eval()来处理此问题。该功能将自动导入rlang::dyn-dots, 或rlang::`:=` , 以及rlang::enquo, rlang::enquos, rlang::.data, ,rlang::as_name和 ,rlang::as_label以处理使用时出现的潜在注释tidyeval。这些将出现在标题为 的新文件中utils-tidy-eval.R。有关更多信息,请参阅此处的文档。

此函数本质上将执行与接受的答案相同的操作,但它会创建一个新文件来保存这些@importFrom函数,并为包中的这些导入创建文档。

TLDR:跑吧usethis::use_tidy_eval()