【发布时间】:2013-04-16 20:05:09
【问题描述】:
data.table 是一个很棒的包,唉,它会从checkUsage 生成无根据的警告(代码来自here 和here):
> 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
可以通过将by=a 替换为by="a" 来避免有关a 的警告,但是如何处理其他3 个警告?
这对我来说很重要,因为这些警告会使屏幕变得混乱并掩盖合法警告。由于警告是在 my.func 调用(启用 JIT 编译器时)发出的,而不仅仅是 checkUsage,我倾向于将其称为 bug。
【问题讨论】:
-
查询:那些是
my.func内部的对象,那么为什么要把它们视为global变量呢? -
我不知道
checkUsage。如果我可以在data.table中更改某些内容,请告诉我。或者也许可以选择checkUsage。 -
使用 data.table 的字节码编译代码似乎不太可能有任何好处,因为几乎所有的 data.table 代码都已经使用了编译后的 C 代码。
-
单元测试与这个问题是正交的。我可以对某事进行单元测试,但仍然没有注意到它对全局命名空间造成了不利影响。
标签: r data.table