如何合并for循环的结果并在R中一次全部打印?

我正在尝试在Amazon上删除某产品的评论,并以CSV格式导出结果。我试图在函数中嵌入for循环,但是它一直失败。因此,我将函数和for循环分开以查看结果,现在我不知道如何将1到10页的for循环结果组合起来。

运行脚本时,它按页面显示评论,但是当我将结果保存为CSV时,该文件只有页面10上的评论。

如何合并for循环的结果并将其完全保存在CSV中?

#install.packages("tidyverse")
#install.packages("rvest")
#install.packages("xml2")

library(tidyverse)
library(rvest)
library(xml2)

#Product = LG OLED77C9PUB Alexa Built-in C9 Series 77" 4K Ultra HD Smart OLED TV (2019)
#ASIN = B07PQ98L9D

scrap_amazon <- function(ASIN,page_num){


url_reviews <- paste0("https://www.amazon.com/LG-OLED77C9PUB-Alexa-Built-Ultra/product-reviews/",ASIN,"/?pageNumber=",page_num)
doc <- read_html(url_reviews)

#Review Date
doc %>%
    html_nodes("[data-hook='review-date']")%>%
    html_text() -> review_data


#Review Title
doc %>%
    html_nodes("[class='a-size-base a-link-normal review-title a-color-base review-title-content a-text-bold']")%>%
    html_text() -> review_title

#Review Text
doc %>%
    html_nodes("[class='a-size-base review-text review-text-content']")%>%
    html_text() -> review_text

#Number of Stars in Review
doc %>%
    html_nodes("[data-hook='review-star-rating']")%>%
    html_text() -> review_star

#Return a tibble
tibble(review_data,review_title,review_text,review_star,page = page_num)%>%
    return()

}


for (i in 1:10){
    review_all <- scrap_amazon(ASIN = "B07PQ98L9D",page_num = i) %>%
                        print(review_all)
}


#save in csv
write.table(review_all,file= "C:/Users/path/review.csv")
jhiyueojvkcjksw 回答:如何合并for循环的结果并在R中一次全部打印?

我们可以使用map_df中的purrr来获取10页的数据

library(rvest)
final <- purrr::map_df(1:10,~scrap_amazon(ASIN = "B07PQ98L9D",page_num = .x))

for循环的问题在于,每次迭代都会覆盖前一个,因此您只能获取最后一个的数据。我们可以创建一个列表来存储所有页面中的数据。

review_all <- vector("list",length = 10)
 for (i in 1:10){
   review_all[[i]] <- scrap_amazon(ASIN = "B07PQ98L9D",page_num = i)
}
final <- do.call(rbind,review_all)

我们可以使用write.csv将数据写入csv

write.csv(final,"C:/Users/path/review.csv",row.names = FALSE)
,

您的reveiw_all变量在for循环的每次迭代中都会更新。因此,在i=1处,review_all保存了第1页的数据,并且由于您的打印命令也在循环内,因此它将打印该结果。但是,当您进行下一次迭代时,review_all将更新为第2页的数据。 因此,最后,review_all仅保存第10页的数据,实质​​上就是您在写入csv时看到的数据。

通常,在使用for循环时,以下类似内容可能会有所帮助。创建一个收集器变量(在以下情况下为结果),其工作是存储for循环的每次迭代结果。

result = vector('list',10)
for(i in 1:10){
  sq = i^2
  cube = i^3
  quad = i^4
  result[[i]] = c(sq,cube,quad)
}

#converting to df
result <- as_tibble(do.call(rbind,result)) %>% set_colnames(c('sq','cube','quad'))
本文链接:https://www.f2er.com/3091231.html

大家都在问