2013-04-23 8 views
7

data.table एक अद्भुत पैकेज है, जो, अफसोस, checkUsage से अनुचित चेतावनियाँ भी सृजित (कोड here और here से आता है) है: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 को प्रतिस्थापित करके टाल दिया गया, लेकिन मैं अन्य 3 चेतावनियों से कैसे निपटूं?

यह मेरे लिए मायने रखता है क्योंकि ये चेतावनियां स्क्रीन को अव्यवस्थित करती हैं और वैध चेतावनियों को अस्पष्ट करती हैं। चूंकि my.func आमंत्रण (जब जेआईटी कंपाइलर सक्षम है) पर चेतावनियां जारी की जाती हैं, न केवल checkUsage तक, मैं इसे bug पर कॉल करने के इच्छुक हूं।

+0

प्रश्न: वे 'my.func' के अंदर वस्तुएं हैं, तो उन्हें 'वैश्विक' चर क्यों माना जाना चाहिए? –

+3

देखें [यह] (http://stackoverflow.com/a/15411032/967840), और [यह] (http://stackoverflow.com/a/8096882/967840) – GSee

+1

मुझे 'checkUsage' नहीं पता है। अगर कुछ है तो मैं 'data.table' में बदल सकता हूं कृपया मुझे बताएं। या शायद 'checkUsage' के लिए एक विकल्प है। –

उत्तर

4

अद्यतन: अब v1.8.11 में हल किया गया है। NEWS से:

.SD, .N, .I, .GRP और .BY अब (NULL के रूप में) निर्यात किया जाता है। इसलिए R CMD check या codetools::checkUsagecompiler::enableJIT() के माध्यम से उनके लिए नोट्स का उत्पादन नहीं किया गया है। utils::globalVariables() पर विचार किया गया था, लेकिन चयनित निर्यात। #2723 बढ़ाने के लिए सैम स्टीनॉल्ड के लिए धन्यवाद।

और स्तंभ नाम प्रतीकों count और a के लिए नोट को हल करने, वे दोनों उद्धरण (यहां तक ​​कि := की एलएचएस पर) के साथ लिपटे जा सकता है। एक नए आर सत्र का उपयोग करना (चूंकि नोट केवल पहली बार थे) निम्नलिखित अब कोई नोट नहीं बनाते हैं।

$ 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 
} 

जैसे कि, स्थानीय रूप से चर अबाध वैश्विक रूप में रिपोर्ट बाध्य करने के लिए है।

लिंक के लिए @ जीएसई के लिए धन्यवाद।

संबंधित मुद्दे