2015-05-03 7 views
9

Ten kod jest przeznaczony do obliczenia całkowitej odległości niektórych danych współrzędnych, ale nie wiem, dlaczego nie działa.Błąd w lis [[i]]: próba wyboru mniej niż jednego elementu

Błąd jest: Error in lis[[i]] : attempt to select less than one element.

Oto kod:

distant<-function(a,b) 
{ 
    return(sqrt((a[1]-b[1])^2+(a[2]-b[2])^2)) 
} 
totdistance<-function(lis) 
{ 
    totdis=0 
    for(i in 1:length(lis)-1) 
    { 
    totdis=totdis+distant(lis[[i]],lis[[i+1]]) 
    } 
    totdis=totdis+distant(lis[[1]],lis[[length(lis)]]) 
    return(totdis) 
} 
liss1<-list() 
liss1[[1]]<-c(12,12) 
liss1[[2]]<-c(18,23) 
liss1[[4]]<-c(29,25) 
liss1[[5]]<-c(31,52) 
liss1[[3]]<-c(24,21) 
liss1[[6]]<-c(36,43) 
liss1[[7]]<-c(37,14) 
liss1[[8]]<-c(42,8) 
liss1[[9]]<-c(51,47) 
liss1[[10]]<-c(62,53) 
liss1[[11]]<-c(63,19) 
liss1[[12]]<-c(69,39) 
liss1[[13]]<-c(81,7) 
liss1[[14]]<-c(82,18) 
liss1[[15]]<-c(83,40) 
liss1[[16]]<-c(88,30) 

wyjściowa:

> totdistance(liss1) 
Error in lis[[i]] : attempt to select less than one element 
> distant(liss1[[2]],liss1[[3]]) 
[1] 6.324555 
+2

Należy zastąpić 'for (i w stosunku 1: długość (Lis -1))' 'do z (i in 1: (length (lis) -1)) '. Operator ':' jest oceniany przed odejmowaniem '-'. – Molx

+1

I chociaż jesteśmy przy tym, macierz jest prawdopodobnie lepiej dopasowana do danych wielokątów niż lista, chyba że istnieją inne właściwości do zapisania. – Molx

+0

Problem rozwiązany. Wielkie dzięki. –

Odpowiedz

11

Pozwól mi odtworzyć swój błąd w prosty sposób

>list1 = list() 
> list1[[0]]=list(a=c("a")) 
>Error in list1[[0]] = list(a = c("a")) : 
attempt to select less than one element 

Więc następnym pytaniem jest, gdzie uzyskujesz dostęp do listy indeksów 0? (Indeksowanie list rozpoczyna się od 1 w R)

Jako Molx, wskazana w poprzednich postach: "Operator: jest oceniany przed odejmowaniem -". Powoduje to dostęp do indeksowanej listy 0.

Dla ex:

> 1:10-1 
[1] 0 1 2 3 4 5 6 7 8 9 
>1:(10-1) 
[1] 1 2 3 4 5 6 7 8 9 

więc zastąpić poniższe linie kodu

>for(i in 1:(length(lis)-1)) 
{  
    totdis=totdis+distant(lis[[i]],lis[[i+1]]) 
} 
Powiązane problemy