R débogage: “seulement 0 peut être mélangé avec de négatif indices”
J'ai un script qui fonctionne très bien quand je le lance manuellement dans la R Studio, mais ne fonctionne pas quand je le lance à partir d'un autre programme via un wrapper.
- Je obtenir cette info dans ma sortie de débogage:
[912] Error in xj[i] : only 0's may be mixed with negative subscripts
[912] Calls: GetTopN -> cor -> is.data.frame -> [ -> [.data.frame
Si je sauvegarde l'image juste avant que je reçois le message d'erreur et le charger dans la R de Studio, je reçois le même message d'erreur quand j'execute GetTopN(10)
. Cependant, si je ré-exécuter l'instruction actionlist<- sqlQuery(channel,al_string)
dans R Studio, puis exécuter GetTopN(10)
tout fonctionne comme il se doit.
J'ai même essayé d'enregistrer l'image dans R Studio juste avant la critique d'appel, puis de le charger via le wrapper avant l'exécution de GetTopN(10) et j'ai eu le même message d'erreur.
J'ai vérifié et toutes les variables pertinentes (crs,z,x,n) ont les bonnes valeurs. Je n'ai aucune idée de ce que pourrait être la cause de cela, et j'apprécierais vraiment de l'aide!
Ici est ce qui est en cours d'exécution (dans l'ordre):
#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)
J'ai sauvé mon espace de travail trop si cela peut aider (4.7 mo): espace de travail
En cas de connexion à ma base de données MYSQL pourrait l'aider, elle doit être ouverte sur 74.73.17.163:3306
OriginalL'auteur Mike Furlender | 2012-02-10
Vous devez vous connecter pour publier un commentaire.
Le problème:
actionlist$RPos[1000]
a une valeur de 21.n1
varie de -31 à 0. Lorsque vous ajoutez eux, vous obtenez un vecteur avec un mélange de valeurs positives et négatives, ce qui n'est pas autorisé dans..Comment j'y suis arrivé: vérifiez d'Abord
traceback()
:Cela me dit que le problème est dans
actionlist$RPos[i] + n1
le plus probable. Ensuite, j'ai juste ajouté un simpleprint(i)
déclaration de me dire qui itération était le problème. (Alternativement, vous pourriez probablement avoir juste vérifiéactionlist$RPos + n1
pour les points chauds manuellement.if (actionlist$RPos[i]>34)
déclaration fixe! La foudre réponse rapide 🙂 je vais utiliser traceback (à l'avenir). Est-il possible d'avoir R imprimer toutes les variables lorsqu'une erreur se produit?Pas sur le haut de ma tête (mais on apprend vite à ne pas dire quelque chose n'est pas possible de R). Cependant, il sera probablement plus efficace à zéro dans sur le lieu du problème à l'aide de
traceback
, puis étudier de plus près à l'aide debrowser
oudebug
.Si vous pouvez anticiper les problèmes à un moment donné dans une fonction, mettre dans un trycatch suivie par une "impression un tas de valeurs" déclaration sorte de faire ce que @Mike demandé.
OriginalL'auteur joran