我尝试过(通过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
的{{1}}?关于后者的注释还有很多其他问题,但我没有看到令人满意的答案。 c
并将列名设置为函数中其他位置的占位符值是丑陋的黑客攻击。我是否应该切换到指定可以解决这两个问题的列的其他方法?
答案 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接口中定义了使用的变量,从而引起了注意。