2012-02-10 10 views
9

Ho uno script che funziona bene quando lo eseguo manualmente in R Studio, ma non funziona quando lo eseguo da un altro programma attraverso un wrapper.Debug R: "solo 0 possono essere combinati con gli indici negativi"

ottengo queste informazioni nella mia uscita di debug:

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

Se salvo l'immagine a destra prima ottengo l'errore e poi caricarla in R Studio ottengo lo stesso errore quando eseguo GetTopN(10). Tuttavia, se rieseguire la dichiarazione actionlist<- sqlQuery(channel,al_string) all'interno di R Studio e quindi eseguire GetTopN(10), tutto funziona come dovrebbe.

Ho persino provato a salvare l'immagine in R Studio appena prima della chiamata critica, quindi caricarla attraverso il wrapper prima di eseguire GetTopN (10) e ho ottenuto lo stesso errore.

Ho controllato e tutte le variabili rilevanti (crs, z, x, n) sembrano avere i valori corretti. Non ho idea di quale potrebbe essere la causa di questo, e apprezzerei davvero un po 'di aiuto!

Qui è quanto viene avviato (in ordine):

#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) 

ho salvato il mio lavoro anche se potrebbe essere utile (4.7MB): workspace Se la connessione al database MySQL avrebbe aiutato, dovrebbe essere aprirà il 74.73.17.163:3306

+0

Anche se questo non era un tuo problema, vale la pena notare che cose che il codice significava per cose che cambiano il significato di [i, j], ad esempio dati .table può anche produrre questo tipo di errore quando viene eseguito su un data.frame, in particolare in una situazione simile alla tua in cui le cose sono in esecuzione in un wrapper e potresti aver fallito nel caricare il pacchetto richiesto – russellpierce

risposta

9

Il problema: actionlist$RPos[1000] ha un valore di 21. n1 varia da -31 a 0. Quando si aggiunge li si ottiene un vettore con un mix di valori positivi e negativi, che non è consentito in sottoinsiemi.

come ci sono arrivato: Primo controllo 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) 

Questo mi dice che il problema è in actionlist$RPos[i] + n1 più probabile. Poi ho appena aggiunto una semplice dichiarazione print(i) per dirmi quale era l'iterazione del problema. (In alternativa, è probabile che tu abbia appena controllato manualmente il problema

+0

Eccellente! 'if (actionlist $ RPos [i]> 34)' la correzione dell'istruzione! Risposta velocissima :) Userò traceback() in futuro. È possibile avere R stampare tutte le variabili quando si verifica un errore? –

+1

@MikeFurlender Non è la parte superiore della mia testa (ma impari velocemente a non dire che qualcosa non è possibile in R). Tuttavia, sarà probabilmente più efficiente azzerare il punto problematico usando 'traceback', e quindi indagare più da vicino usando' browser' o 'debug'. – joran

+0

Se è possibile anticipare i problemi in un determinato punto di una funzione, inserire un trycatch seguito da una frase "print a bunch of values" farebbe un po 'di cosa chiede @Mike. –

Problemi correlati