语法糖 || “.”的检查失败||我如何导入它或设置全局变量?

syntactic sugar || check fails for '.' || how do I import it or set global variable?

#create package

devtools::create("./brainy",rstudio=F)

usethis::use_package("dplyr", type = "import", min_version = TRUE) ## set dependancy

我有一个小函数,我使用 dplyr 中的 %>%。管道时我也使用 . 。我不知道 . 是从哪里导入的,也不知道在 check()ing 包

时如何实现对齐

我的小 R 代码如下所示:

add<-function(x,y){ 
#' Package provides sample data that are loaded with package loading. 
#' @param a and y are variables
#' #not RUN
#' @importFrom dplyr %>%

data_test<-data.frame(ID=c(seq(1:10)), NAME=c(paste("ID",seq(1:10),sep="_")))

data_test$NAME<-data_test$NAME %>%  gsub("_*","",.) # for getting warning about .

return(x+y)

}

我创建了一个测试数据,用于提问和重现。

我运行以下事情:

devtools::document()  
devtools::check()

我收到警告:

  add: no visible binding for global variable ‘.’
  Undefined global functions or variables:
    .

如何设置我的代码使其与 check(). 达成一致。下面的资源建议放入 globalVariables,但是我在哪里(函数,文件)设置全局变量?

希望是最后一个问题 - 我应该使用以下哪一项以及为什么:

usethis::use_package("dplyr", type = "Depends", min_version = TRUE)

usethis::use_package("dplyr", type = "import", min_version = TRUE)

https://www.r-bloggers.com/no-visible-binding-for-global-variable/

工具版本

dplyr_1.0.0
usethis_1.6.1
devtools_2.3.1
rmarkdown_2.3
R 4.0.0 (2020-04-24)

应要求,我将我的评论变成了答案,因为这些也可能在将来对其他人有所帮助。

通常可以通过使用 utils::globalVariables 定义变量来解决 全局变量没有可见绑定 错误。不幸的是,这不适用于 ..

相反,人们应该坚持使用类似 tidyverse 的语法并使用 mutate.data 等替代方法。在tidyverse风格中,add(这里命名为add_fn是为了避免名称冲突)可以改写如下:


add_fn<-function(x,y){
  #' Package provides sample data that are loaded with package loading.
  #' @param x some variable
  #' @param y another variable
  #' @importFrom dplyr %>% mutate


  data_test<-data.frame(ID=c(seq(1:10)),
                        NAME=c(paste("ID",seq(1:10),sep="_")))

  data_test<-data_test %>%
       mutate({{NAME = gsub("_*","",NAME)}})

  return(x+y)

}

以上使用 rlang 中的 {{}} 通过非标准评估解析 NAME

或者,在这个具体示例中,根本不需要使用 tidyverse

add_fn<-function(x,y){
  #' Package provides sample data that are loaded with package loading.
  #' @param x some variable
  #' @param y another variable
  #' @importFrom dplyr %>% mutate


  data_test<-data.frame(ID=c(seq(1:10)),
                        NAME=c(paste("ID",seq(1:10),sep="_")))

  data_test$NAME<-gsub("_*","",data_test$NAME)

  return(x+y)

}

检查结果:


-- R CMD check results ------------------------------------- brainy 0.0.0.9000 ----
Duration: 1m 38.7s

0 errors √ | 0 warnings √ | 0 notes √