繁体   English   中英

R错误:替换的长度为零

[英]R Error: replacement has length zero

我正在尝试确定最接近的位置以指示平仓(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) 

正如R中的简单for循环中所建议的那样,R中会产生“替换长度为零”来检查numeric(0),但事实并非如此。 我在这里想念什么?

编辑

我才意识到

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

因此,我用于查找正确索引位置的代码将是错误的。 但是,我仍然期望它能够运行。

您正在收到该错误,因为您正在尝试分配长度为零的值。 将这行代码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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM