R语言 “:=”没有可见的全局函数定义

azpvetkf  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(133)

我正在写一个使用tidyeval的包。因为我使用tidyeval,所以在描述文件的imports下面列出了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时没有定义:=,我编辑了这个问题以使其更清楚。

erhoui1w

erhoui1w1#

在你更新了答案之后,对我来说,这有点像是一个完整的副本,唯一的区别是,你在DESCRIPTION中添加了rlang,而没有看到它和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中将rlangdplyr添加到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()之后),我没有得到那个注解。
长话短说,DESCRIPTION中的Import是不够的,您还需要NAMESPACE指令。

ig9co6j1

ig9co6j12#

我想添加一个截至2023年的更新-你现在可以运行usethis::use_tidy_eval()来处理这个问题。该函数将自动导入rlang::dyn-dots,或rlang:::=``,沿着rlang::enquorlang::enquosrlang::.datarlang::as_name,和rlang::as_label,以处理使用tidyeval时可能出现的注解。这些注解将出现在一个名为utils-tidy-eval.R的新文件中。有关更多信息,文档为here
这个函数基本上与接受的答案做同样的事情,但是它创建了一个新文件来保存这些@importFrom函数,并且在包中为这些导入创建文档。
TLDR:只需运行usethis::use_tidy_eval()

相关问题