10

data.table是一个很棒的包,唉,它会产生无根据checkUsage的警告(代码来自这里这里):

> library(compiler)
> compiler::enableJIT(3)
> dt <- data.table(a = c(rep(3, 5), rep(4, 5)), b=1:10, c=11:20, d=21:30, key="a")
> my.func <- function (dt) {
  dt.out <- dt[, lapply(.SD, sum), by = a]
  dt.out[, count := dt[, .N, by=a]$N]
  dt.out
}
> checkUsage(my.func)
<anonymous>: no visible binding for global variable ‘.SD’ (:2)
<anonymous>: no visible binding for global variable ‘a’ (:2)
<anonymous>: no visible binding for global variable ‘count’ (:3)
<anonymous>: no visible binding for global variable ‘.N’ (:3)
<anonymous>: no visible binding for global variable ‘a’ (:3)
> my.func(dt)
Note: no visible binding for global variable '.SD' 
Note: no visible binding for global variable 'a' 
Note: no visible binding for global variable 'count' 
Note: no visible binding for global variable '.N' 
Note: no visible binding for global variable 'a' 
   a  b  c   d count
1: 3 15 65 115     5
2: 4 40 90 140     5

a可以通过替换来避免by=a关于的警告by="a",但是我该如何处理其他3个警告?

这对我来说很重要,因为这些警告会使屏幕混乱并掩盖合法的警告。由于警告是在my.func调用时发出的(启用 JIT 编译器时),而不仅仅是由发出的checkUsage,我倾向于将其称为bug

4

2 回答 2

6

更新:现在在 v1.8.11 中解决。来自新闻

.SD, .N, .I,.GRP.BY现在被导出(作为NULL)。这样就不会通过R CMD checkcodetools::checkUsagevia为它们生成注释compiler::enableJIT()utils::globalVariables()被考虑过,但选择了出口。感谢 Sam Steingold 提出,#2723

并且要解析列名符号count和的注释a,它们都可以用引号括起来(甚至在 的 LHS 上:=)。使用新的 R 会话(因为注释只是第一次),以下现在不产生注释。

$ R
R version 3.0.1 (2013-05-16) -- "Good Sport"
Copyright (C) 2013 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)
> require(data.table)
Loading required package: data.table
data.table 1.8.11  For help type: help("data.table")
> library(compiler)
> compiler::enableJIT(3)
[1] 0
> dt <- data.table(a=c(rep(3,5),rep(4,5)), b=1:10, c=11:20, d=21:30, key="a")
> my.func <- function (dt) {
  dt.out <- dt[, lapply(.SD, sum), by = "a"]
  dt.out[, "count" := dt[, .N, by="a"]$N]
  dt.out
}
> my.func(dt)
   a  b  c   d count
1: 3 15 65 115     5
2: 4 40 90 140     5
> checkUsage(my.func)
> 
于 2013-09-10T10:26:39.630 回答
2

看来此时唯一的办法就是

my.func <- function (dt) {
  .SD <- .N <- count <- a <- NULL  # avoid inappropriate warnings
  dt.out <- dt[, lapply(.SD, sum), by = a]
  dt.out[, count := dt[, .N, by=a]$N]
  dt.out
}

即,在本地绑定报告为未绑定全局变量的变量。

感谢@GSee 的链接。

于 2013-04-24T13:34:50.173 回答