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

时间:2017-04-27 15:48:25

标签: 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 variableab的{​​{1}}?关于后者的注释还有很多其他问题,但我没有看到令人满意的答案。 c并将列名设置为函数中其他位置的占位符值是丑陋的黑客攻击。我是否应该切换到指定可以解决这两个问题的列的其他方法?

2 个答案:

答案 0 :(得分:0)

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

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)

您显然仍然必须在包中某处将ignore中的函数定义为globalVariables。

我将它放在Package / RStudio插件中,然后重新访问此答案。

答案 1 :(得分:0)

除了使用globalVariables,您还可以在本地定义这些变量,而不污染全局环境。
我将从github issue Rdatatable/data.table#850

复制我的评论
  

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

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