2016-08-27 11 views
6

My package के DESCRIPTION फ़ाइल इसके आयात निर्देश में httr है ओवरराइड करने के लिए:कैसे आर पैकेज से निर्यात समारोह आयात में सूचीबद्ध

Imports: 
    httr (>= 1.1.0), 
    jsonlite, 
    rstudioapi 

httrlength.path के लिए exports an S3method

S3method(length,path) 

और यह defined as है:

#' @export 
length.path <- function(x) file.info(x)$size 

अपने पैकेज में मैं वस्तुओं है कि मैं करने के लिए वर्ग "पथ" आवंटित की है। जब भी मैं, किसी भी वस्तु के लिए कक्षा "पथ" निर्दिष्ट किया जाए या नहीं मैंने कभी वस्तु पर length() फोन की परवाह किए बिना, इस stdout में छपा है:

:

Error in file.info(x) : invalid filename argument 

यहाँ कुछ प्रतिलिपि प्रस्तुत करने योग्य कोड हर किसी को चला सकते हैं है

> sessionInfo() 
R version 3.3.1 (2016-06-21) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.11.5 (El Capitan) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] tools_3.3.1 

> thing = 1:5 
> class(thing) = 'path' 

> requireNamespace('httr') 
Loading required namespace: httr 

> sessionInfo() 
R version 3.3.1 (2016-06-21) 
Platform: x86_64-apple-darwin13.4.0 (64-bit) 
Running under: OS X 10.11.5 (El Capitan) 

locale: 
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8 

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

loaded via a namespace (and not attached): 
[1] httr_1.2.1 R6_2.1.2 tools_3.3.1 

> thing = 1:5 
> class(thing) = 'path' 
Error in file.info(x) : invalid filename argument 

मैं एक try में यह पकड़ने की कोशिश की है, लेकिन वह काम नहीं करता:

set_class = function(obj, c) { 
    class(obj) = c 
    return(obj) 
} 

thing = 1:5 
thing = try(set_class(thing, 'path'), silent=TRUE) 

पैदावार:

Error in file.info(x) : invalid filename argument 

मैं assignInNamespace की कोशिश की है समारोह ओवरराइड करने के लिए:

base_length = function(obj) { 
    return(base::length(obj)) 
} 

assignInNamespace('length.path', base_length, 'httr') 
thing = 1:5 
class(thing) = 'path' 

लेकिन मैं Error: evaluation nested too deeply: infinite recursion/options(expressions=)?

मिल जब मैं अपने पैकेज में httr कार्यों का उपयोग मैं उन्हें httr::function साथ उपयोग करती हैं इसलिए मुझे यकीन है कि नहीं कर रहा हूँ यह length.path फ़ंक्शन मेरे नेमस्पेस में लीक हो रहा है और आधार लंबाई फ़ंक्शन को ओवरराइड कर रहा है। मैंने httr::function का उपयोग करने के बजाय उपयोग किए जाने वाले प्रत्येक फ़ंक्शन के लिए स्पष्ट @importFrom httr function भी कोशिश की है लेकिन यह या तो काम नहीं करता है।

मैं भी इस पाया:

https://support.bioconductor.org/p/79059/

लेकिन समाधान httr के स्रोत कोड है, जो मैं अपने पैकेज यह आयात के बाद से ऐसा नहीं कर सकते संपादित करने के लिए लग रहा था। मैं इसके पास कैसे आ सकता हूं?

+1

यदि 'लंबाई()' एक सामान्य है, तो आप डिफ़ॉल्ट विधि प्राप्त करने के लिए 'base :: length.default() 'को कॉल करना चाहते हैं। – Thomas

+0

समस्या यह है कि मैं कभी भी कॉल नहीं करता हूं। ऐसा तब होता है जब मैं कक्षा (obj) = 'path' –

+0

कहता हूं, मुझे लगता है कि 'वर्ग (obj) =' path'' केवल RStudio या इसी तरह के IDE के भीतर एक त्रुटि देता है जहां आप मूल रूप से 'str (...) 'आपके वर्कस्पेस चर के लिए हर समय। जब आप एक नई कक्षा असाइन करते हैं तो आईडीई इस विवरण को अपडेट करता है और प्रक्रिया में 'लंबाई' कॉल करता है। "सामान्य" आरजीईई में त्रुटि नहीं होती है। – AEF

उत्तर

1

एक संभावना आपके पैकेज में length.path() फ़ंक्शन बनाने के लिए हो सकती है। अपने path -objects के आधार प्रकार base::length() के साथ संगत है, तो आप सिर्फ यह अनंत प्रत्यावर्तन से बचने के लिए unclass सकता है:

length.path <- function(x) length(unclass(x)) 

हालांकि, इस संभावित base::length() के लिए एक सीधा कॉल की तुलना में धीमी है क्योंकि यह प्रतियां वस्तु और जरूरतों विधि दो बार प्रेषण।

+0

हम्म, काम नहीं लग रहा है। मेरे पैकेज में वर्बैटिम जोड़ा गया है और अभी भी त्रुटि को stdout में देख रहा है। क्या मुझे इसे निर्यात करने की ज़रूरत है? मेरे पथ वस्तु का मूल प्रकार एक सूची है, इसलिए मुझे लगता है कि इसे ठीक काम करना चाहिए। –

+0

क्या आप सुनिश्चित हैं कि त्रुटि 'आयात: प्रस्तुति' द्वारा DESCRIPTION फ़ाइल में बनाई गई है? मैंने सिर्फ एक डमी पैकेज बनाने की कोशिश की जो प्रेजेंटर आयात करता है और इसमें केवल एक फ़ंक्शन होता है जो वर्ग 'पथ' का ऑब्जेक्ट देता है। सब कुछ काम करता है। केवल जब मैं डमी पैकेज लोड करने के बाद 'पुस्तकालय (fansr)' कहता हूं तो त्रुटि उत्पन्न होती है। – AEF

+0

ऐसा तब तक प्रतीत नहीं होता जब तक कि मैं अपने पैकेज में एक फ़ंक्शन का उपयोग नहीं करता जो 'fansr' का उपयोग करता है। इसलिए यदि मैं लाइब्रेरी (RNeo4j) और फिर sessionInfo(), 'fansr' नेमस्पेस लोड नहीं होता है, लेकिन जैसे ही मैं अपने पैकेज से एक फ़ंक्शन का उपयोग करता हूं जो आंतरिक रूप से' httr :: func' का उपयोग करता है, मैं sessionInfo में 'httr' देखता हूं()। और वह तब होता है जब मैं file.info त्रुटि को पुन: पेश कर सकता हूं। –

0

मेरे लिए समाधान .onLoad फ़ंक्शन जोड़ना था। unclass विचार के लिए AEF's answer पर धन्यवाद।

#' @importFrom utils assignInNamespace 
.onLoad = function(libname, pkgname) { 
    length.path = function(obj) { 
    return(length(unclass(obj))) 
    } 

    assignInNamespace('length.path', length.path, 'httr') 
} 

यह R CMD check --as-cran में एक NOTE को जन्म देती है, लेकिन मैं इसके साथ दूर होने की उम्मीद कर रहा हूँ।

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