我尝试了(通过roxygen2)@import data.table
并仅导入了我使用的函数(@importFrom data.table data.table rbindlist setkey setDT := .SD
。两种方式都会收到有关.
“函数”的警告,我认为是由于这种用法:
dt[x, .(a, b, c)]
。我找不到任何.
不会导致导入的方法一个错误。
而作为一个后续问题,有没有隐藏的一个推荐的方式no visible binding for global variable
进行a
,b
和c
?关于后一个NOTE还有很多其他问题,但我还没有一个令人满意的答案。globalVariable
并将列名设置为函数中其他位置的占位符值是很丑陋的。我应该切换到其他指定列的方法来解决这两个问题吗?
除了使用之外,globalVariables
您还可以在本地定义这些变量,而不会污染全局环境。我将从github 问题 Rdatatable/data.table#850
复制我的评论
您可以在使用变量之前将 NULL 分配给变量(不要与覆盖它混淆)。因此,您没有定义全局变量,而只是在使用它们的函数中本地定义它们。
值得注意的是,该问题与任何 NSE 接口相关,而不仅仅是 data.table。NSE 基本上使 CRAN 检查无法调查所使用的变量是否已在某些 NSE 接口中定义,从而引发注释。
我认为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)
Run Code Online (Sandbox Code Playgroud)
显然,您仍然必须ignore
在包中的某个位置将函数定义为 globalVariables 一次。
当我抽出时间并重新访问这个答案时,我会将其放入 Package/RStudio 插件中。