Отладка R: "только 0 могут быть смешаны с отрицательными индексами" - PullRequest
13 голосов
/ 10 февраля 2012

У меня есть скрипт, который отлично работает, когда я запускаю его вручную в R Studio, но не работает, когда я запускаю его из другой программы через оболочку.

Я получаю эту информацию в выводе отладки:

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

Если я сохраню изображение прямо перед тем, как получу ошибку, а затем загрузлю ее в R Studio, то получу ту же ошибку при выполнении GetTopN(10). Однако, если я перезапущу оператор actionlist<- sqlQuery(channel,al_string) в R Studio, а затем выполню GetTopN(10), все будет работать как надо.

Я даже пытался сохранить изображение в R Studio прямо перед критическим вызовом, а затем загрузить его через оболочку перед выполнением GetTopN (10), и я получил ту же ошибку.

Я проверил, и все соответствующие переменные (crs, z, x, n), кажется, имеют правильные значения. Я понятия не имею, что может быть причиной этого, и я очень признателен за помощь!

Вот что выполняется (по порядку):

#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,7 МБ): рабочая область Если подключение к моей базе данных MYSQL поможет, оно должно быть открыто на 74.73.17.163:3306

1 Ответ

14 голосов
/ 10 февраля 2012

Проблема: actionlist$RPos[1000] имеет значение 21. n1 колеблется от -31 до 0. При их добавлении вы получаете вектор со смесью положительных и отрицательных значений, что недопустимо в подмножестве.

Как я туда попал: Первая проверка 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 на наличие проблемных мест вручную.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...