如何在R语言中结合使用map()与possibly()处理API请求报错
解决map()结合possibly()处理Facebook API报错的问题
嘿,这个问题我之前也碰到过!其实possibly()和map()结合的关键是先把getPost()的额外参数预先绑定好,让它变成一个只接受query_id的函数,这样possibly()就能正常处理啦。给你两种常用的方法:
方法一:使用匿名函数包装
你可以在possibly()内部定义一个匿名函数,把token和n这些固定参数直接写进去,让这个匿名函数只需要接收query_id作为输入:
# 创建安全版的getPost函数,报错时返回NULL(可自定义默认值) safe_getPost <- possibly(function(id) { getPost(id, token = fb_oauth, n = 1000) }, otherwise = NULL) # 用map调用这个安全函数 posts_data <- map(posts$query_id, safe_getPost)
这样一来,遇到无效的query_id时,函数不会中断,而是返回你设置的otherwise值(这里是NULL),后续你可以轻松过滤掉这些无效结果。
方法二:用purrr::partial预先绑定参数
如果你觉得匿名函数不够简洁,可以用purrr::partial()来预先绑定getPost()的固定参数,生成一个新的函数,再用possibly()包装:
# 预先绑定token和n参数,生成新函数 getPost_with_args <- partial(getPost, token = fb_oauth, n = 1000) # 包装成安全函数,报错返回NULL safe_getPost <- possibly(getPost_with_args, otherwise = NULL) # 执行map posts_data <- map(posts$query_id, safe_getPost)
后续处理:过滤无效结果
处理完后,你可以用purrr::compact()过滤掉所有NULL值,只保留有效数据:
# 过滤无效结果 valid_posts <- compact(posts_data) # 如果每个有效结果都是数据框,可以合并成一个大的数据框 combined_posts <- map_dfr(valid_posts, identity)
内容的提问来源于stack exchange,提问作者mundos
相关产品推荐
相关产品推荐

