在软件包中使用data.table时,R CMD检查注意:“。”没有可见的全局函数定义。

Mat*_*ers 7 r data.table

我尝试了(通过roxygen2)@import data.table并仅导入了我使用的函数(@importFrom data.table data.table rbindlist setkey setDT := .SD。两种方式都会收到有关.“函数”的警告,我认为是由于这种用法: dt[x, .(a, b, c)]。我找不到任何.不会导致导入的方法一个错误。

而作为一个后续问题,有没有隐藏的一个推荐的方式no visible binding for global variable进行abc?关于后一个NOTE还有很多其他问题,但我还没有一个令人满意的答案。globalVariable并将列名设置为函数中其他位置的占位符值是很丑陋的。我应该切换到其他指定列的方法来解决这两个问题吗?

jan*_*cki 5

除了使用之外,globalVariables您还可以在本地定义这些变量,而不会污染全局环境。我将从github 问题 Rdatatable/data.table#850
复制我的评论

您可以在使用变量之前将 NULL 分配给变量(不要与覆盖它混淆)。因此,您没有定义全局变量,而只是在使用它们的函数中本地定义它们。

值得注意的是,该问题与任何 NSE 接口相关,而不仅仅是 data.table。NSE 基本上使 CRAN 检查无法调查所使用的变量是否已在某些 NSE 接口中定义,从而引发注释。


Ste*_*n F 1

我认为globalVariables()这是最好的方法...如果您选择使用该globalVariables()方法,此功能将为您自动执行该过程。它需要软件包pkgloadcodetools

globs <- function(    
  fun,    
  pkg = rprojroot::find_package_root_file(),    
  ignore = c(":=", ".SD", ".BY", ".N", ".I", ".GRP")    
){    
  pkg <- basename(pkg)    
  ns  <- c(   
    ls(pkgload::pkg_env("base")),    
    ls(pkgload::ns_env(pkg)),    
    ls(pkgload::imports_env(pkg)),    
    ignore    
  )     

  res <- sort(setdiff(   
    codetools::findGlobals(fun),    
    ns   
  ))

  cat(strwrap(paste0("utils::globalVariables(c(", paste('"', res, '"', collapse = ", ", sep = ""), "))"), width = 80), sep = "\n")

  res    
}


#example
globs(data.table::between)
Run Code Online (Sandbox Code Playgroud)

显然,您仍然必须ignore在包中的某个位置将函数定义为 globalVariables 一次。

当我抽出时间并重新访问这个答案时,我会将其放入 Package/RStudio 插件中。