如何使用 map() 和 possible()

How to use map() with possibly()

我正在使用 map() 从 Facebook 获取 post 数据,代码如下:

posts_data <- map(posts$query_id, getPost, token = fb_oauth, n = 1000)

但是,某些 query_id 观察结果不正确,或者是共享事件,API 无法检索这些事件并给我一个错误,例如:

Error in callAPI(url = url, token = token, api = api) : 
  Unsupported get request. Object with ID '1816137521765810_1832190963493790' does not exist, cannot be loaded due to missing permissions, or does not support this operation. Please read the Graph API documentation at https://developers.facebook.com/docs/graph-api

我知道我可以使用 possibly() 继续调用,同时返回这些错误的输出,这样函数就不会停止。但是我不知道如何一起使用 possibly()map(),因为 possible() 只接受一个函数作为参数,并且不允许我向该函数传递额外的参数。

possibly 将一个函数作为参数,但它 returns 另一个函数,它接受与其输入相同的参数。所以你应该能够做到:

posts_data <- map(posts$query_id, 
      possibly(getPost, otherwise = NA_character_), 
      token = fb_oauth, n = 1000)

我假设您要提取 'comments' 和 'replies' 等 我有一个与之前的答案略有不同的方法——转换成一个整洁的数据帧(只是要小心 dplyr 和 plyr 之间的冲突)

1 提取您的帖子数据框(您已经完成)

2 子集 'comments' > 0

的帖子
sum(OB1_posts$comments_count)
mydata <- OB1_posts[OB1_posts$comments_count > 0,]
sum(mydata$comments_count) # How many 'Posts' had Comments

3 提取评论

3.1: 创建 possible() 函数来捕获错误并忽略

library(purrr)
BruteForce_comments <- possibly( getPost, otherwise = NA_real_) 

Comments <- OB1_posts$id %>%
map(BruteForce_comments, token = fboauth, n = 200000, comments = TRUE,
likes = FALSE, n.likes=1, n.comments=600000) %>%
reduce(append)

转换为 DataFrame

library(plyr)
OB1_Comments <- ldply(Comments, data.frame)

这与回复相同,然后将它们合并在一起(但您只需要先 'streamline' 列配置)

如果还有什么问题可以私信我。这个软件包非常出色,您可以从中获取大量信息 - 即使在 1 月下旬发生变化后也是如此