2014-04-23 8 views
17

मुझे roxygen2 निर्यात किए गए कार्यों में काम करने के लिए डेटा.table प्राप्त करने में कोई समस्या हो रही है।आर निर्यात किए गए कार्यों में डेटाटेबल ब्रेक

यहाँ foo.R नामक एक फ़ाइल में एक सरल, नकली समारोह (अपने पैकेज के आर निर्देशिका में स्थित है), जो data.table का उपयोग करता है:

#' Data.table test function 
#' @export 
foo <- function() { 
    m <- data.table(c1 = c(1,2,3)) 
    print(is.data.table(m)) 
    m[,sum(c1)] 
} 

अगर मैं कॉपी और आर में इस समारोह पेस्ट, इस समारोह ठीक काम करता है:

> foo <- function() { 
+ m <- data.table(c1 = c(1,2,3)) 
+ print(is.data.table(m)) 
+ m[,sum(c1)] 
+ } 
> foo() 
[1] TRUE 
[1] 6 

लेकिन अगर मैं बस निर्यात समारोह लोड, आर सोचता है कि data.table एक data.frame और टूटता है:

> rm(foo) 
> load_all() 
Loading test_package 
> foo 
function() { 
    m <- data.table(c1 = c(1,2,3)) 
    print(is.data.table(m)) 
    m[,sum(c1)] 
} 
<environment: namespace:test_package> 
> foo() 
[1] TRUE 
Error in `[.data.frame`(x, i, j) : object 'c1' not found 

क्या हो रहा है?

अद्यतन

धन्यवाद मदद के लिए @GSee करने के लिए। ऐसा लगता है कि यह वास्तव में एक devtools मुद्दा है। नीचे इंटरैक्टिव कमांड लाइन कोड देखें।

test_package पुस्तकालय, foo रन सही ढंग से लोड करने के बाद:

> foo 
function() 
{ 
    m <- data.table(c1 = c(1, 2, 3)) 
    print(is.data.table(m)) 
    m[, sum(c1)] 
} 
<environment: namespace:test_package> 
> foo() 
[1] TRUE 
[1] 6 

load_all() टूट जाता है चल रहा है foo:

> source('R/foo.R') 
> foo 
function() { 
    m <- data.table(c1 = c(1,2,3)) 
    print(is.data.table(m)) 
    m[,sum(c1)] 
} 
> foo() 
[1] TRUE 
[1] 6 

और करने के लिए भविष्य के कॉल:

> load_all() 
Loading test_package 
> foo() 
[1] TRUE 
Error in `[.data.frame`(x, i, j) : object 'c1' not found 

किसी तरह source('R/foo.R') foo कार्यक्षमता जान load_all()foo फिर से नहीं टूटते:

> load_all() 
Loading test_package 
> foo 
function() { 
    m <- data.table(c1 = c(1,2,3)) 
    print(is.data.table(m)) 
    m[,sum(c1)] 
} 
> foo() 
[1] TRUE 
[1] 6 

इसके अलावा, मैं 1.5 DevTools के लिए अद्यतन और .datatable.aware=TRUE जोड़ने की कोशिश की, लेकिन वह कुछ भी करने को नहीं मालूम था।

+0

क्या आप सुनिश्चित हैं कि आपके पैकेज में 'foo' बिल्कुल वही है (यानी आपने 'x [' और 'col3'? – BrodieG

+0

के बीच अल्पविराम को छोड़ दिया नहीं है। वे सचमुच कॉपी-एंड- फ़ाइल कमांड लाइन में फ़ाइल foo.R (ऊपर दिखाया गया) से फ़ंक्शन चिपकाया। – kjmij

+0

कमांड लाइन पर 'yourpackagename :: foo' जांचें ताकि यह सुनिश्चित किया जा सके कि वे वास्तव में वही हैं। सिर्फ इसलिए कि आप अपने संपादक पर जो फ़ाइल देखते हैं ऐसा लगता है कि एक्स का मतलब यह नहीं है कि आपके आर सत्र में लोड किए गए पैकेज में फ़ंक्शन वही है। – BrodieG

उत्तर

12

समस्या, जैसा कि @GSee ने बताया (टिप्पणियों के तहत) this issue अभी भी प्रतीत होता है।

> data.table:::cedta 
function (n = 2L) 
{ 
    te = topenv(parent.frame(n)) 
    if (!isNamespace(te)) 
     return(TRUE) 
    nsname = getNamespaceName(te) 
    ans = nsname == "data.table" || "data.table" %chin% names(getNamespaceImports(te)) || 
     "data.table" %chin% tryCatch(get(".Depends", paste("package", 
      nsname, sep = ":"), inherits = FALSE), error = function(e) NULL) || 
     (nsname == "utils" && exists("debugger.look", parent.frame(n + 
      1L))) || nsname %chin% cedta.override || identical(TRUE, 
     tryCatch(get(".datatable.aware", asNamespace(nsname), 
      inherits = FALSE), error = function(e) NULL)) 
    if (!ans && getOption("datatable.verbose")) 
     cat("cedta decided '", nsname, "' wasn't data.table aware\n", 
      sep = "") 
    ans 
} 
<bytecode: 0x7ff67b9ca190> 
<environment: namespace:data.table> 

प्रासंगिक जाँच यहाँ है:

"data.table" %chin% get(".Depends", paste("package", nsname, sep=":"), inherits=FALSE) 

जब

आदेश जानने के लिए कि एक पैकेज data.table बारे में पता है, data.table समारोह cedta() है, जो कहता है एक पैकेज पर data.table पर निर्भर करता है, उपरोक्त आदेश TRUE वापस करना चाहिए - यानी, यदि आपने पैकग स्थापित किया है ई R CMD INSTALL के माध्यम से और फिर पैकेज लोड किया। ऐसा इसलिए है क्योंकि, जब आप पैकेज लोड करते हैं, तो डिफ़ॉल्ट रूप से आर नामस्थान में "डीपेंड" चर बनाता है। यदि आप ने क्या किया:

ls("package:test", all=TRUE) 
# [1] ".Depends" "foo"  

हालांकि, जब तुम devtools:::load_all() करते हैं, इस चर सेट करने के लिए प्रतीत नहीं होता।

# new session + set path to package's dir 
devtools:::load_all() 
ls("package:test", all=TRUE) 
# [1] "foo" 

तो, cedta() पता चला है कि इस पैकेज वास्तव में data.table पर निर्भर करता है नहीं मिलता है। हालांकि, जब आप मैन्युअल रूप से .datatable.aware=TRUE निर्धारित करते हैं, लाइन:

identical(TRUE, get(".datatable.aware", asNamespace(nsname), inherits = FALSE)) 

मार डाला जाता है, जो सच लौट सकते हैं और इसलिए जाएगा मुद्दे पर काबू पा। लेकिन तथ्य यह है कि devtools पैकेज के नामस्थान में .Depends चर नहीं रखता है।

सब कुछ, यह वास्तव में data.table के साथ कोई समस्या नहीं है।

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