R错误:替换长度为零

时间:2017-01-14 09:21:37

标签: r for-loop

我正在尝试确定最近的位置来表示近距离位置(cP)。

假设我有以下内容:

indicator.Trade=c(1,1,0,0,-1,0,0,0,1,1,0,-1,-1)
cP=c(NA,NA,1,1,NA,-1,NA,NA,1,NA,NA,1,NA)

## If indicator.Trade[1] is 1, I want to obtain order.book[1,1]=1 and order.book[2,1]=3. 
## If indicator.Trade[2] is 1, I want to obtain order.book[1,2]=2 and order.book[2,2]=3.

order.book=matrix(0,nrow=2,ncol=(length(indicator.Trade)-1))
for(i in 1:(length(indicator.Trade)-1)){
   if( (indicator.Trade[i]==1) ){
       order.book[1,i]=i
       order.book[2,i]=head(which(cP[c((i):(length(indicator.Trade)-1))]==1),1)
   }    else if(indicator.Trade[i]==-1){
       order.book[1,i]=i
       order.book[2,i]=head(which(cP[c((i):(length(indicator.Trade)-1))]==-1),1)
   }    else {
       order.book[1,i]=i
       order.book[2,i]=0
   }
}

但是运行上面的代码我得到以下错误:

 in order.book[2, i] = head(which(cP[c((i):(length(indicator.Trade) -  : 
  replacement has length zero

我尝试手动替代:

i=1 and i=(length(indicator.Trade)-1) 

正如Simple for loop in R producing "replacement has length zero" in R中建议检查数字(0)但似乎并非如此。我在这里缺少什么?

修改

我刚刚意识到这一点

head(which(cP[c(((length(indicator.Trade)-1)):(length(indicator.Trade)-1))]==1),1)
[1] 1

所以,我找到正确索引位置的代码是错误的。但是,我仍然期待它可以运行。

1 个答案:

答案 0 :(得分:0)

您收到该错误,因为您尝试分配长度为零的值。将这行代码print(which(cP[c((i):(length(indicator.Trade)-1))]==-1))放在else if()块中,看看错误来自那里。这是因为:用于获取两个数字之间的序列。在这里,您尝试获取具有空值的序列,这是无效的操作。它发生在else if块中的第12列。我也在下面的代码中添加了print语句。

尝试这个小练习,看看发生了什么

a1 <- NULL   # create a null variable
1:a1         # generate sequence using `:` 
# Error in 1:a1 : argument of length 0

这就是我在for循环中使用seq_len函数的原因。阅读?seq_len?seq_along手册页。

修改后的代码

indicator.Trade=c(1,1,0,0,-1,0,0,0,1,1,0,-1,-1)
cP=c(NA,NA,1,1,NA,-1,NA,NA,1,NA,NA,1,NA)
len_ind_tr <- length(indicator.Trade)

order.book <- matrix(0,nrow=2,ncol=len_ind_tr-1)) 

for(i in seq_len(len_ind_tr-1)){
  if(indicator.Trade[i] == 1){
    order.book[1,i] <- i
    order.book[2,i] <- which(cP[i:(len_ind_tr-1)] == 1)[1]
  } else if(indicator.Trade[i] == -1){
    order.book[1,i] <- i
    order.book[2,i] <- which(cP[i:(len_ind_tr-1)] == -1)[1]
    print(which(cP[i:(len_ind_tr-1)] == -1))
  } else {
    order.book[1,i] <- i
    order.book[2,i] <- 0
  }
}

order.book
#       [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] [,12]
# [1,]    1    2    3    4    5    6    7    8    9    10    11    12
# [2,]    3    2    0    0    2    0    0    0    1     3     0    NA