2011-04-01 8 views
8

मैं आर में एक अजीब समस्या से लड़ रहा हूं। मैं आरसीपीपी का पुराना संस्करण उपयोग करता हूं कुछ सी ++ के साथ आर को एकीकृत करने के लिए (दुख की बात है अपग्रेडिंग एक विकल्प नहीं है!), मैं जिस आरसीपीपी का उपयोग करता हूं वह पुराना आरसीसीपीप्लेट है। हालांकि मुझे संदेह है कि समस्या वहां है।आर में इस त्रुटि के सामान्य मामले क्या हैं: "SET_STRING_ELT() का मान 'CHARSXP' होना चाहिए 'वर्ण' नहीं '

मैं कुछ आर कोड है जो ठीक समय की सबसे चलाता है, लेकिन (खासकर जब डेटा की एक बड़ी राशि के प्रसंस्करण) अवसर पर Value of SET_STRING_ELT() must be a 'CHARSXP' not a 'character'

यह हमेशा सूची के संचालन में विफल रहता है, जैसे के साथ रहस्यमय तरीके से विफल रहता है:

res[["blabla"]] = r 

लेकिन अगर मैं options(error=recover) का उपयोग करता हूं और त्रुटि के बाद इसका प्रयास करता हूं, तो असाइनमेंट को कोई समस्या नहीं हो सकती है। सी ++ केवल संख्यात्मक वैक्टर से संबंधित है और असल में असाइनमेंट से कोड को असफल होने में बहुत दूर है।

तो मेरा अस्पष्ट सवाल यह है कि: इस तरह के व्यवहार के सबसे आम कारण क्या हैं? खराब यादाश्त? खराब वस्तुओं (शायद खराब RcppResultSet)?

platform  i386-pc-solaris2.10 
arch   i386 
os    solaris2.10 
system   i386, solaris2.10 
status 
major   2 
minor   10.1 
year   2009 
month   12 
day   14 
svn rev  50720 
language  R 
+0

एक पुनरुत्पादित उदाहरण आपको मदद करने के लिए थोड़ा आसान बना देगा --- जो कुछ भी मुश्किल होगा क्योंकि कुछ लोग अभी भी आपके जैसे दिनांकित सॉफ़्टवेयर संस्करण चलाते हैं। –

+0

मेरी इच्छा है कि मेरे पास एक सॉफ्टवेयर था जिस पर मैं चलाता हूं: एस इस समस्या को पुन: पेश करना मुश्किल है, इसलिए मुझे संदेह है कि इसे किसी प्रकार के स्मृति भ्रष्टाचार के साथ करना है। मेरा सवाल लाइनों के साथ और अधिक है, क्या आपने कभी कुछ इसी तरह से लड़ा है? क्या समस्या हो रही है? डिबगिंग में थोड़ा सा मार्गदर्शन ... –

+0

जैसा कि आप कल्पना कर सकते हैं, मेरा उपयोग उस पर ध्यान केंद्रित नहीं करता जिसे हम बहिष्कृत आरसीपीपी एपीआई कहते हैं। त्रुटि संदेश के लिए, मुझे नहीं लगता कि मैंने इसे कभी देखा है। यह आर में भी तय हो सकता है। –

उत्तर

12

इस सी कोड में एक त्रुटि से आ रही है, एक पैकेज है कि आप प्रयोग कर रहे हैं (नहीं आर ही) में होने की संभावना: मैं इस मुद्दे ...

पूर्णता के लिए हमला कर समस्याएं हो रही हैं। या तो सी कोड गलत तरीके से लिखा गया है और आप कभी-कभी उस कोड शाखा का मूल्यांकन करते हैं, या सी कोड गलत तरीके से लिखा जाता है और यह स्मृति को दूषित करता है। शायद यह एक सी डीबगर की आवश्यकता है; मैं सोलारिस बारे में निश्चित नहीं हूँ, लेकिन लिनक्स पर मैं एक स्क्रिप्ट है कि मज़बूती से त्रुटि reproduces बनाएंगे (यह कुछ काम ले जा सकते हैं, लेकिन एक आवश्यक कदम है) तो

R -d gdb 
gdb> r # (r)un R 
> ^C## cntrl-C key, breaks into the debugger 
gdb> b Rf_error # set breakpoint when error occurs; tab completion available 
gdb> C# continue in R 
> source("test-script.R") # [error occurs] 
gdb> bt # backtrace -- current call stack, from Rf_error entry 
gdb> up # move up the stack; use this to get to package C code 

हैं और फिर इसके बारे में सावधान संवीक्षा है कोड, विशेष रूप से PROTECT का गलत उपयोग करने की तलाश में है। gdb help देखें। मैं दृढ़ता से सुझाव देता हूं कि आर और आपके पैकेज अपडेट करें, क्योंकि बग ठीक हो जाते हैं और आप इसमें काफी समय निवेश करने वाले हैं।

+2

ठीक है। मैं यह समझ गया। असंभव मामले में एक और गरीब आत्मा इसके साथ लड़ जाएगी, मेरी समस्या आरपीपीआरवीक्टर का उपयोग करने के कारण आर से एक मैट्रिक्स पास करने के दौरान थी। किसी भी तरह आरसीपीआरवीक्टर ने शिकायत नहीं की लेकिन इससे अवसर पर दूषित स्मृति हुई। –

+0

पुरानी एपीआई के साथ आपको इनमें से अधिक गुप्त त्रुटियों को देखने की संभावना है। –

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