Как мне предотвратить перезапись моих результатов циклом for

#r

#r

Вопрос:

Я хотел бы просмотреть все сезоны с 2003-2004 по 2019-2020 годы голландской футбольной лиги, включая 34 игровых раунда (я использую этот веб-сайт https://www.voetbal.com/wedstrijdgegevens/ned-eredivisie-2003-2004-spieltag /). Как вы можете видеть в моем коде, он показывает мне только результаты прошлого сезона. Я думаю, что он перезаписывает другие сезоны. Что я делаю не так? Что я должен добавить в свой код? Кто-нибудь может мне помочь?

Вот код, который я использую:

 library(tidyverse)
library(dplyr)
library(ggplot2)
library(caret)
library(rvest)
library(devtools)
library(httr)
library(tidyr)
library(tibble)
library(xml2)
library(tidyr)
library(stringr)

url <- sprintf("https://www.voetbal.com/wedstrijdgegevens/ned-eredivisie-%d-%d-spieltag/", 2003:2019, 2004:2020)

basis<-function(url){
  
  website <- read_html(url)
  
  Sys.sleep(2)
  
  datum <- website %>% 
    html_nodes(".data .standard_tabelle td[nowrap]:nth-of-type(1)") %>%
    html_text()
  
  tijdstip <- website %>% 
    html_nodes(".data .standard_tabelle td[nowrap]:nth-of-type(2)") %>%
    html_text()
  
  thuisclub <- website %>%
    html_nodes(".data .standard_tabelle [align='right'] a") %>%
    html_text()
  
  uitclub <- website %>%
    html_nodes(".standard_tabelle td:nth-of-type(5) a") %>%
    html_text()
  
  uitslag <- website %>%
    html_nodes(".data .standard_tabelle td[nowrap]:nth-of-type(6)") %>%
    html_text()
  
  return(tibble(datum=datum, tijdstip=tijdstip, thuisclub=thuisclub, uitclub=uitclub, uitslag=uitslag))
}

overige_seizoenen<-function(url){
  for (i in 1:17){
    
    list_of_pages<-str_c(url[[i]], 1:34)
    
    table <-list_of_pages%>%
      map(basis)%>%
      bind_rows()
    
    }
return(table)
}
  

jochem <- overige_seizoenen(url)
```
  

Комментарии:

1. циклы for всегда сохраняют только последнюю запись. есть несколько способов обойти это. одной из возможностей было бы сохранить / добавить каждый результат во внешнюю / глобальную переменную, такую как пустой data.frame. вы также можете использовать готовый пакет «magicfor», который сохраняет каждую итерацию цикла for.

2. Упростите свой пример, нужны ли нам все эти пакеты?

Ответ №1:

Я подозреваю, что в цикле есть ошибка for . В R, если вы хотите, чтобы цикл повторялся от элемента 1 до 10, вы не можете просто сказать for (i in 10) , вы должны уточнить это как for (i in 1:10) . Итак, попробуйте этот цикл сейчас:

 for (i in 1:seizoenen){
    
    list_of_pages<-str_c(url[[i]], 1:34)
    
    table <-list_of_pages%>%
      map(basis)%>%
      bind_rows()
    
    }
return(table)
}
  

Комментарии:

1. моя ошибка, «seizoenen» была неправильной. В моем коде было значение 1: 17. Я изменил его. Но все же у меня есть только последний результат.