2012-08-06 28 views
5

Uzun gönderiden dolayı özür dileriz! R için yeniyim ve dilin emrini geliştirmek için çok çalışıyorum. Ben kodu çalıştırdığınızda Tam Sezon (ilk bahsedilen sayfa 36, ​​apandisit sayfa 59) Benzet sorunlarla yayınlanmaya devam http://www1.maths.leeds.ac.uk/~voss/projects/2010-sports/JamesGardner.pdfHata * tmp * [[j]]: alt sınırını aştı

: Mankenlik futbol sonuçlarına bu ilginç proje tökezledi

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) 

bir Traceback() çalıştığınızda alıyorum yanıtı

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

olduğunu, bu şimdiye elde ediyoruz:

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

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

1: Games(TeamParameters) 

Hatanın ne anlama geldiğini anlamıyorum ve herhangi bir yardımı takdir ediyorum. Bir kez daha, uzun yazı için özür dilerim ama bu proje ile gerçekten ilgileniyorum ve sorunun ne olduğunu öğrenmek isterim!

cevap

4

Data.frame nesneleri, [<-.data.frame işlemiyle satır tarafından genişletilemez. (rbind'u kullanmanız gerekir.) Önceden boyutlandırılmış bir matris veya data.frame yeterli alana sahip bir nesne oluşturmanız gerekir. "C", 0 satırın bir nesnesiyse, birinciye atamaya çalışmak başarısız olur. "C" adlı bir fonksiyon var, bu yüzden ismini daha belirgin hale getirmek isteyebilirsiniz. Ayrıca, çift döngüye göre daha verimli yöntemler de var gibi görünüyor, ancak parametre nesnesini çok iyi tanımlamadınız.

Sen Ek o kağıdın nasıl bir dataframe önceden boyut gösterileri gösterdi görebilirsiniz:

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

... ve kabul edilmiştir-nesne oyunları zaten satır doğru sayıda olması ve hesapların sonuçları yeni sütun değerleri atamaktadır. Bu başvurulan sütun için geçerli bir değer yoksa, $<- işlemi başarılı olacaktır.