2012-02-10 9 views
9

मेरे पास एक स्क्रिप्ट है जो इसे मैन्युअल रूप से आर स्टूडियो में चलाने पर ठीक काम करती है, लेकिन जब मैं इसे किसी अन्य प्रोग्राम से रैपर के माध्यम से चलाता हूं तो काम नहीं करता है।आर डिबगिंग: "केवल 0 को नकारात्मक सबस्क्रिप्ट के साथ मिश्रित किया जा सकता है"

मैं अपने डिबग आउटपुट में यह जानकारी मिलती है:

[912] Error in xj[i] : only 0's may be mixed with negative subscripts 
[912] Calls: GetTopN -> cor -> is.data.frame -> [ -> [.data.frame 

मैं सही इससे पहले कि मैं त्रुटि मिलती छवि को सहेजते हैं और उसके बाद आर स्टूडियो में लोड जब मैं GetTopN(10) निष्पादित मैं एक ही त्रुटि मिलती है। हालांकि, अगर मैं आर स्टूडियो के भीतर actionlist<- sqlQuery(channel,al_string) स्टेटमेंट को फिर से चलाता हूं और फिर GetTopN(10) निष्पादित करता है, तो यह सब कुछ काम करता है।

मैंने भी गंभीर कॉल से पहले आर स्टूडियो के भीतर छवि को सहेजने की कोशिश की, और फिर GetTopN (10) को निष्पादित करने से पहले इसे रैपर के माध्यम से लोड किया और मुझे एक ही त्रुटि मिली।

मैंने चेक किया और सभी प्रासंगिक चर (सीआरएस, जेड, एक्स, एन) में उचित मान होते हैं। मुझे नहीं पता कि इसका क्या कारण हो सकता है, और मैं वास्तव में कुछ मदद की सराहना करता हूं!

यहाँ (क्रम में) निष्पादित किया जा रहा है:

#INIT: 
library(RODBC) 
library(stats) 

channel<- odbcConnect("data") 
crs<-mat.or.vec(3000,5) #will hold correlations 
n1<-seq(-33,0) 

#Get whole series 
z <- sqlQuery(channel,"SELECT RPos,M1,M2,M3,M4 FROM `data`.`z` ") 
al_string <- "SELECT RPos,OpenTime FROM z JOIN actionlist on(OpenTime = pTime)" 
trim_string<- "DELETE FROM ActionList WHERE OpenTime NOT IN (SELECT OpenTime FROM ReducedList)" 

GetTopN<-function(n) 
{ 
    for(i in 1:nrow(actionlist)) 
    { 
    crs[i,1]<-actionlist$OpenTime[i] 
    for(j in 2:ncol(z)) 
    { 
    crs[i,j]<-cor(z[actionlist$RPos[i]+n1,j],x[,j]) 
    } 
    } 
    avc <- (cbind(crs[,1],rowSums(crs[,2:5]))) 
    sorted <- crs[order(avc[,2], decreasing=T),1] 
    topx<- head(sorted,n) 
    bottomx <- tail(sorted,n) 
    DF<-as.data.frame(c(topx,bottomx),row.names=NULL) 
    colnames(DF)[1]<-'OpenTime' 
    sqlSave(channel,dat=DF,tablename='ReducedList',append=F,rownames=F,safer=F) 
    sqlQuery(channel,trim_string) 
} 


curpTime <- 1275266400 
actionlist<- sqlQuery(channel,al_string) 

x<- sqlQuery(channel,paste('SELECT pTime,M1,M2,M3,M4 FROM z WHERE pTime <= ',curpTime,' AND 
pTime > ',curpTime,'-(300*34) ORDER BY pTime ASC')) 

GetTopN(10) 

मैं अपने कार्यक्षेत्र भी अगर यह मदद कर सकता है (4.7MB) को बचाया: workspace अगर मेरे MYSQL डेटाबेस से कनेक्ट करने में मदद मिलेगी, यह होना चाहिए 74.73.17.163:3306

+0

हालांकि यह आपकी समस्या नहीं थी - यह ध्यान देने योग्य है कि कोड उन चीजों के लिए है जो [i, j], जैसे डेटा को बदलते हैं .table इस तरह की त्रुटि उत्पन्न कर सकता है जब वे डेटा.फ्रेम के खिलाफ चलाए जाते हैं। विशेष रूप से, आपके जैसी स्थिति में जहां चीजें एक रैपर में चल रही हैं और आप आवश्यक पैकेज लोड करने में असफल हो सकते हैं। – russellpierce

उत्तर

9

को खुलेगा समस्या: जब आप उन्हें जोड़ने आप धनात्मक और ऋणात्मक मानों का एक मिश्रण है, जो subsetting में अनुमति नहीं है के साथ एक वेक्टर मिल actionlist$RPos[1000] 0 पर -31 से 21 n1 पर्वतमाला की एक मूल्य है।

मैं वहाँ कैसे मिल गया: सबसे पहले जाँच traceback():

traceback() 
5: `[.data.frame`(z, actionlist$RPos[i] + n1, j) at #8 
4: z[actionlist$RPos[i] + n1, j] at #8 
3: is.data.frame(x) at #8 
2: cor(z[actionlist$RPos[i] + n1, j], x[, j]) at #8 
1: GetTopN(10) 

यह मुझसे कहता समस्या actionlist$RPos[i] + n1 सबसे अधिक संभावना है। तब मैंने बस एक सरल print(i) कथन जोड़ा ताकि मुझे यह बताने के लिए कि कौन सा पुनरावृत्ति समस्या थी। (वैकल्पिक रूप से, आप शायद actionlist$RPos + n1 को मैन्युअल रूप से मुसीबतों के लिए actionlist$RPos + n1 देख सकते हैं।

+0

उत्कृष्ट! 'अगर (एक्शनलिस्ट $ आरपीओएस [i]> 34) 'कथन ने इसे ठीक किया! बिजली की तेज प्रतिक्रिया :) मैं भविष्य में ट्रेसबैक() का उपयोग करूंगा। क्या त्रुटि होने पर सभी चरों को आर प्रिंट करना संभव है? –

+1

@ माइकफर्लेंडर मेरे सिर के ऊपर से नहीं (लेकिन आप जल्दी से सीखना नहीं चाहते कि आर में कुछ संभव नहीं है)। हालांकि, यह 'ट्रेसबैक' का उपयोग कर परेशानी स्थान पर शून्य होने के लिए अधिक कुशल होगा, और उसके बाद 'ब्राउज़र' या 'डीबग' का उपयोग करके अधिक बारीकी से जांच करें। – joran

+0

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

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