Векторизация paste0 для цикла в R - PullRequest
0 голосов
/ 25 сентября 2018

Я строю простой скребок в R, который обрабатывает нумерацию страниц.Я попытался использовать paste0 для циклического перемещения по структуре разбитого на страницы URL-адреса.

#a vector of the urls to scrape
a <- 1:5


URLs <- function(pages) {
out <- matrix(ncol = 1, nrow = 5)
for (i in seq_along(a)) {
    fdata <- paste0("https://foo.bar", i, "/")
    out[, i] <- apply(fdata)
}}

df <- lapply(URLs, function(u){

  html.obj <- read_html(u)
  title <- html.obj %>% html_nodes('a.storylink') %>% html_text()
  score <- html.obj %>% html_nodes('span.score') %>% html_text()

 data.frame(title = title, score = score)
})


library(reshape)
data <- merge_recurse(df)

View(data)

Однако, когда я пытаюсь это сделать, вывод не заполняет должным образом переменную URL-адресов, и поэтому остальная часть сбора зацикленных данныхне выполняется вообще.

Я не смог найти здесь других вопросов, которые касались бы циклического прохождения через составные элементы, подобные этому.

Может кто-нибудь дать представление о том, куда я идунеправильно?

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Я думаю, что URLs должен быть список / вектор ссылок, например:

URLs <- paste0("https://foo.bar", a, "/")
# > URLs
# [1] "https://foo.bar1/" "https://foo.bar2/" "https://foo.bar3/" "https://foo.bar4/" "https://foo.bar5/"
0 голосов
/ 25 сентября 2018

Проблема с функцией URLs заключается в том, что она заканчивается циклом for.Это связано с тем, что цикл for возвращает NULL в R после завершения.

x <- for(i in 1:5){
  #do something
}
print(x)
NULL

Если вы завершите функцию оператором return(out), это вполне может решить вашу проблему.

Редактировать: Хотя решение Minem может решить проблемуболее кратко, я оставлю этот ответ здесь как напоминание не заканчивать функции циклами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...