':=' 没有可见的全局函数定义
no visible global function definition for ':='
我正在编写一个使用 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评估的一部分吗?
编辑:
我已经阅读了问题“,尽管那里的答案解释了为什么会出现这样的问题。它没有解释为什么当我导入 rlang
时未定义 :=
。我已经编辑了使这一点更清楚的问题。
在您更新您的答案后,对我来说,这在某种程度上取决于它是否完全重复。此处唯一的区别是您在 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
命名空间标签。我确保将 rlang
和 dplyr
添加到 DESCRIPTION
和 运行 devtools::document()
中的 Imports
。然后当我 运行 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 之后)时,我没有收到该注释。
长话短说,DESCRIPTION
中的 Import
是不够的。您还需要 NAMESPACE
个指令。
我正在编写一个使用 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评估的一部分吗?
编辑:
我已经阅读了问题“rlang
时未定义 :=
。我已经编辑了使这一点更清楚的问题。
在您更新您的答案后,对我来说,这在某种程度上取决于它是否完全重复。此处唯一的区别是您在 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
命名空间标签。我确保将 rlang
和 dplyr
添加到 DESCRIPTION
和 运行 devtools::document()
中的 Imports
。然后当我 运行 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 之后)时,我没有收到该注释。
长话短说,DESCRIPTION
中的 Import
是不够的。您还需要 NAMESPACE
个指令。