2012-08-06 18 views
5

Przeprosiny za długi post! Jestem nowy w R i ciężko pracuję, aby poprawić swoją znajomość tego języka. Natknąłem się na ten ciekawy projekt na wynikach modelowania piłkarskich: http://www1.maths.leeds.ac.uk/~voss/projects/2010-sports/JamesGardner.pdfBłąd w * tmp * [[j]]: indeks dolny poza granicami

trzymam systemem do problemów podczas uruchamiania kodu symulować cały sezon (pierwszy wymieniony strona 36, ​​dodatek strona 59):

Games <- function(parameters) 

{ 
teams <- rownames(parameters) 
P <- parameters$teams 
home <- parameters$home 
n <- length(teams) 
C <- data.frame() 
row <- 1 
for (i in 1:n) { 
    for (j in 1:n) { 
    if (i != j) { 
C[row,1] <- teams[i] 
C[row,2] <- teams[j] 
C[row,3] <- rpois(1, exp(P[i,]$Attack - P[j,]$Defence + home)) 
C[row,4] <- rpois(1, exp(P[j,]$Attack - P[i,]$Defence)) 
row <- row + 1 
    } 
    } 
} 
return(C) 
} 

Games(TeamParameters) 

odpowiedź mogę to

Error in `*tmp*`[[j]] : subscript out of bounds 

Gdy próbuję traceback(), to jest to, co mam:

3: `[<-.data.frame`(`*tmp*`, row, 1, value = NULL) at #11 

2: `[<-`(`*tmp*`, row, 1, value = NULL) at #11 

1: Games(TeamParameters) 

Nie bardzo rozumiem, co oznacza błąd i byłbym wdzięczny za każdą pomoc. Jeszcze raz przepraszam za długi post, ale jestem naprawdę zainteresowany tym projektem i chciałbym dowiedzieć się, jaki jest problem!

Odpowiedz

4

Obiekty data.frame nie można rozszerzyć o wiersz z operacją [<-.data.frame. (Będziesz musiał użyć rbind.) Powinieneś utworzyć obiekt, który ma wystarczającą ilość miejsca, albo wstępnie zwymiarowaną macierz albo data.frame. Jeśli "C" jest obiektem 0 wierszy, to próba przypisania do wiersza pierwszego zakończy się niepowodzeniem. Istnieje funkcja o nazwie "C", więc możesz chcieć nadać jej nazwę bardziej wyrazistą. Wydaje się również prawdopodobne, że istnieją bardziej wydajne metody niż podwójna pętla, ale nie opisałeś obiektu parametrów bardzo dobrze.

Można zauważyć, że dodatek tego papieru cytowane pokazuje, jak wstępnie zwymiarowania dataframe:

teams <- sort(unique(c(games[,1], games[,2])), decreasing = FALSE) 
T <- data.frame(Team=teams, ...) 

... a gry-obiekt założono już odpowiednią liczbę wierszy i wyniki obliczeń przypisywały nowe wartości kolumn. Operacja $<- zakończy się pomyślnie, jeśli nie ma bieżącej wartości dla tej kolumny z odniesieniami.

Powiązane problemy