R:"下标超出范围"功能错误

时间:2014-03-20 04:00:41

标签: r function for-loop

我继续在我的功能上出错,可能我忽略了一些简单的事情。在应用函数时,我无法运行代码而不会出现错误。

k.nn <- function(k,p1,p) {                          
k > 0                           
K <-length(k)                               
p=matrix()                                      

for (i in p) {                                             
matrix <- cbind(p,p1[1],p1[2])                  
d <- sqrt((matrix[,1]-matrix[,3])^2+(matrix[,2]-matrix[,4])^2)  
}

##use the sort function to find the smallest distance from 1:k and return all nearest k values
sort.d <- function(x) {                             #implement bubble sort      
N=length(x)                                     
N>0                                                  
c=class(x)                                      
for (n in length(x):2) {                            #distinguish the last term in the vector, name it, much be of x length, consists an error of length 1. Error if you compute n in length(x):1, cover length of 1
if(length(x)<2) 
return(x)
 for (m in 1:(n - 1)) {                             #distinguish the first term in the vector, name it
 if(x[m]>x[m + 1]) {                            #begin comparing each term to neighboring term
swap<-x[m]                                      
x[m]<-x[m + 1]          
x[m + 1]<-swap  
}
}
}
return(x)                                       
}

sorted=sort.d(d)                                    

 for (n in k){
 print(sorted[1:k])}                            
 }
 p=matrix(c(6.9,7.6,7.1,.4,6.2,1.8,2.5,2.3,5.7,6.9,.9,4.4,5.2,1.9,.6,7.4,1.2,6.6,3.3,4.9),nrow=10,ncol=2) #given matrix
p1=c(6,6)                                       
k=3                                         nn.3=k.nn(k,p1,p)                                   
print(nn.3)

1 个答案:

答案 0 :(得分:0)

缺少回车或&#34;;&#34;在倒数第二行中抛出错误。如果您删除了最后一行,以便您可以使用traceback(),它会告诉您k.nn会抛出一个&#34;下标超出范围&#34;矩阵索引为4时出错。

调试101告诉您放入打印功能以查看功能失败的位置并在

之后放入打印
        c=class(x)     ; print(c)              

...给你一个结果,但是在sort.d函数中添加另一个不会被执行。从那一点看上游代码,我们看到:

 d <- sqrt((matrix[,1]-matrix[,3])^2+(matrix[,2]-matrix[,4])^2)  

所以看看你给出的函数和矩阵,......我的猜测是你将一个两列矩阵传递给一个期望四列参数的函数。