2013-04-23 38 views
7

data.table是一個精彩包,其中,唉,從checkUsage產生無理警告(代碼來自herehere):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

+0

查詢:那些是my.func內的對象,那麼爲什麼它們應該被認爲是'global'變量呢? – 2013-04-23 14:53:58

+3

請參見[this](http://stackoverflow.com/a/15411032/967840)和[this](http://stackoverflow.com/a/8096882/967840) – GSee 2013-04-23 14:57:52

+1

我不知道'checkUsage'。如果有什麼我可以在'data.table'中修改的,請告訴我。或者,也許有一個選擇'checkUsage'。 – 2013-04-23 15:12:58

回答

4

UPDATE:現已在v1.8.11中解決。從NEWS

.SD.N.I.GRP.BY現在出口(如NULL)。所以這些NOTE不是由R CMD checkcodetools::checkUsage通過compiler::enableJIT()爲他們生產的。被認爲是utils::globalVariables(),但選擇了出口。 感謝Sam Steingold提升,#2723

,並解決了列名標誌counta的筆記,他們都可以用引號(甚至對:=的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) 
> 
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的鏈接。