问题 R调试:“只有0可以与负下标混合”


我有一个脚本,当我在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.7mb): 工作区 如果连接到我的MYSQL数据库会有所帮助,那么应该打开它 74.73.17.163:3306


12586
2018-02-10 00:57


起源

虽然这不是你的问题 - 值得注意的是那些代码意味着改变[i,j]含义的东西,例如data.table在针对data.frame运行时也会产生这种错误。特别是,在类似于您的情况下,事情正在运行到包装器中,您可能无法加载所需的包。 - russellpierce


答案:


问题: 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 手动排除故障点。


11
2018-02-10 01:18



优秀!一个 if (actionlist$RPos[i]>34) 声明修好了!闪电快速响应:)我将来会使用traceback()。发生错误时是否可以让R打印所有变量? - Mike Furlender
@MikeFurlender不是我的头脑(但你很快就会学到不要说R中不可能的东西)。但是,使用故障点归零可能会更有效 traceback,然后进行更密切的调查 browser 要么 debug。 - joran
如果你可以预测一个函数中给定点的麻烦,那么输入一个trycatch然后“打印一堆值”语句就会像@Mike那样做。 - Carl Witthoft