我在 R 中有一个循环,它每分钟从 API 中增量抓取 Reddit 评论(例如,从现在到 1 分钟前、1 分钟前和 2 分钟前、2 分钟前和 3 分钟之间包含某个关键字的所有评论)分钟前等):
library(jsonlite)
part1 = "https://api.pushshift.io/reddit/search/comment/?q=trump&after="
part2 = "m&before="
part3 = "m&size=500"
results = list()
for (i in 1:526000)
{tryCatch({
{
url_i<- paste0(part1, i+1, part2, i, part3)
r_i <- data.frame(fromJSON(url_i))
results[[i]] <- r_i
myvec_i <- sapply(results, NROW)
print(c(i, sum(myvec_i)))
}
}, error = function(e){})
}
final = do.call(rbind.data.frame, results)
saveRDS(final, "final.RDS")
我想分割这个循环,以便它以 20000 次迭代的分段运行,保存每个分段,然后继续下一个分段。
这是我正在使用的代码:
index = seq(1, 526000, by = 20000)
max = as.numeric(length(index) -1 )
###########################################
results = list()
for (i in 1:max)
{tryCatch({
{
start_i = index[i]
end_i = index[i+1]
url_i<- paste0(part1, end_i, part2, start_i, part3)
resource_i <- data.frame(fromJSON(url_i))
results[[i]] <- r_i
myvec_i <- sapply(results, NROW)
print(c(i, sum(myvec_i)))
}
}, error = function(e){})
final_i = do.call(rbind.data.frame, results)
title_i = paste0("file_", i, ".RDS")
saveRDS(final_i, title_i )
}
我不确定我是否正确地执行了此操作 - 有人可以告诉我如何正确执行此操作吗?
谢谢!
最佳答案
如果逻辑是循环每个 block ,则获取序列(“索引”),创建“开始”作为索引,“结束”是删除第一个元素并附加 526000(作为索引)后从 1 减去 1最后一个元素是 520001。循环 'start' 序列,从该索引中提取相应的 'start', 'end' (start_i
, end_i
),然后循环start_i:end_i
之间的序列并应用代码,同时将输出附加到 result
list
index <- seq(1, 526000, by = 20000)
start <- index
end <- c(index[-1] - 1, 526000)
part1 <- "https://api.pushshift.io/reddit/search/comment/?q=trump&after="
part2 <- "m&before="
part3 <- "m&size=500"
results <- list()
for(i in seq_along(start)) {
start_i <- start[i]
end_i <- end[i]
for(j in start_i:end_i) {
tryCatch({
url_j<- paste0(part1, j+1, part2, j, part3)
resource_j <- data.frame(fromJSON(url_j))
results[[j]] <- resource_j
myvec_j <- sapply(results, NROW)
print(c(j, sum(myvec_j)))
}, error = function(e){
})
final_j = do.call(rbind.data.frame, results)
title_j = paste0("file_", j, ".RDS")
saveRDS(final_j, title_j )
}
}
关于r - 将循环拆分为子循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73857166/