【问题标题】:Vectorizing a paste0 for loop in R在 R 中矢量化 paste0 for 循环
【发布时间】:2019-02-28 15:12:23
【问题描述】:

我正在 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)

但是,当我尝试这个时,输出没有正确填充 URLs 变量,因此循环数据收集的其余部分根本不会执行。

我在这里找不到任何其他问题,这些问题涉及像这样的连接项目的循环。

有人可以提供我哪里出错的想法吗?

【问题讨论】:

  • 什么是out[, i] &lt;- apply(fdata)?你的apply-call 是错误的(没有MARGIN=FUN=)。你应该得到一个错误?!
  • 您是说我需要在apply 调用中指定预期的行数吗?
  • apply("https://foo.bar1/") 对我产生了错误:match.fun(FUN) 中的错误:缺少参数“FUN”,没有默认值错误?
  • 我最终使用了@minem 提供的解决方案,因此完全删除了整个部分
  • 请阅读 stackoverflow.com/help/someone-answers 在 SO 上向 @minem 表示感谢的方式是 upvoteaccept

标签: r for-loop vectorization


【解决方案1】:

我认为URLs 需要是链接的列表/向量,例如:

URLs <- paste0("https://foo.bar", a, "/")
# > URLs
# [1] "https://foo.bar1/" "https://foo.bar2/" "https://foo.bar3/" "https://foo.bar4/" "https://foo.bar5/"

【讨论】:

  • 此解决方案完美运行,谢谢!所以,换句话说,我根本不需要循环来创建那个 URL 向量?
  • @user1725872 是的,如果真实模式与您的示例中的一样。 “粘贴”是矢量化的
  • 有道理。一个有趣的发现是,如果我用URLs &lt;- c("https://foo.bar1", "https://foo.bar2", ...) 之类的东西手动设置 URLs 变量,我的数据框会从每个页面中抓取数据。但是,当我在这里使用您的解决方案来设置 URLs 变量时,只有 foo.bar1 被刮掉。关于为什么会发生这种情况的任何想法?
  • @user1725872 那么你可能错误地定义了URLs
  • 看起来我只需要删除 paste0 函数末尾的额外“/”。一切顺利!
【解决方案2】:

URLs 函数的问题在于它以 for 循环结束。这是因为 for 循环一旦完成就会在 R 中返回 NULL

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

如果您以 return(out) 语句结束函数,这可能会很好地解决您的问题。

编辑:虽然 minem 的解决方案可能更简洁地解决问题,但我将在此处留下这个答案,以提醒不要使用 for 循环结束函数。

【讨论】:

  • 这有助于日后参考。谢谢。
猜你喜欢
  • 2020-05-03
  • 1970-01-01
  • 2014-10-03
  • 2012-12-10
  • 1970-01-01
  • 2018-12-08
  • 2018-10-15
  • 2023-03-21
相关资源
最近更新 更多