【问题标题】:Continue for-loop despite private profile error message尽管有私人配置文件错误消息,但继续 for-loop
【发布时间】:2021-11-23 22:26:48
【问题描述】:

我有一个来自 VKontakte 的用户 ID 列表,我循环通过该列表来提取数据。但是,id 列表中充满了导致循环崩溃的私人帐户。有没有办法可以忽略错误消息并使用列表中的下一个用户 ID 继续循环?

我试过tryCatch(),但我似乎没有工作。

library(vkR)


for(user in na.omit(user_id_df$user_id)) {
  
  cat("Downloading VK data for user ", user, "...\n", sep = "")
  
  # Get data on VK user
  VK_data <- tryCatch(getWallExecute(owner_id = user, count = 0))
  
  # Save each user data as a seperate rds
  saveRDS(VK_data, paste0(user, "_VK_user.rds"))
  
}
Error in vk_stop(message = response$error$error_msg, error_code = response$error$error_code) : 
  This profile is private

更新:

我已经包含了 data.frame user_id_df

user_id_df <- structure(list(user_id = c(75315975L, 260432248L, 146972540L, 
                          139319097L, 74581795L, 441289912L, 139057874L, 409031930L, 51094211L, 
                          454800165L, 153893444L, 245170359L, 164009337L, 60193034L, 88824647L, 
                          160007199L, 29038672L, 303965627L, 411867598L, 227838659L, 91434822L, 
                          136816466L, 380966710L, 90695060L, 31550010L, 139747803L, 394283973L, 
                          132706991L, 66665986L, 11226063L, 20013437L, 54971153L, 136190750L, 
                          26500653L, 121766445L, 306519071L, 335255297L, 59321786L, 159745507L, 
                          145640244L, 283457719L, 161410495L, 543060909L, 439197838L, 65620234L, 
                          125886445L, 144465565L, 32416978L, 140118829L, 425256458L, 296079317L, 
                          168287322L, 273692995L, 112552215L, 244680770L, 171262442L, 85039812L, 
                          491952362L, 204601469L, 519813224L, 155014462L, 263137049L, 481696873L, 
                          217103610L, 35076657L, 137893873L, 190725766L, 247486388L, 219246226L, 
                          336022520L, 461933304L, 190319135L, 363516012L, 142188273L, 62187129L, 
                          141131903L, 518132203L, 224083708L, 203352438L, 174489946L, 137521740L, 
                          421466244L, 457935447L, 169945391L, 285490572L, 368047039L, 270575191L, 
                          275894625L, 179505995L, 536600894L, 9237680L, 39667506L, 49672847L, 
                          18317139L, 169262865L, 14312145L, 236979823L, 380162918L, 60828980L, 
                          67772465L)), class = "data.frame", row.names = c(NA, -100L))

【问题讨论】:

  • 你能展示一个可重现的小例子吗
  • 发生错误时,您希望VK_data 是什么?现在你实际上并没有捕捉到错误条件。也许你想要VK_data &lt;- tryCatch(getWallExecute(owner_id = user, count = 0), error=function(e) NULL)
  • 首先,不要循环执行! R中的循环是免费的。如果没有for 循环,你想做的事情绝对可以更优雅、更高效地完成。其次,使用dput 函数向我们提供一些数据。通过查看您的数据,我们将能够为您提供更好的帮助。
  • @MrFlick 建议的解决方案完成了工作 `VK_data
  • @MarcoLiedecke - 您是否查看过该软件包的各种错误处理功能?仅通过检查文档,我就可以识别出一对夫妇,例如has_error(response)。那么为什么不首先遍历您的列表并检查哪些 user_ids “表现良好”并保留它们,然后对剩余的“良好”列表再次重复。

标签: r for-loop try-catch vk


【解决方案1】:

试试这个。不幸的是,我没有访问这些数据的授权令牌,也无法试用。但它应该适合你。

library(tidyverse)
library(vkR)

fVK_data = function(id){
  tryCatch(
    {
      id %>% getWallExecute(count = 0) %>% saveRDS(paste0(id, "_VK_user.rds"))
      return("saved")
    }, error = function(msg){
      return("Error")
    }
  )
}

user_id_df = user_id_df %>% as_tibble() %>% 
  mutate(status = map(user_id, ~fVK_data(.x))) %>% 
  unnest(status)

【讨论】:

  • 嘿@MarcoLiedecke。你试过我的解决方案吗?有效吗?
  • 抱歉@Marek 回复晚了。我很感激帮助。代码不是从 VKontakte 实际提取数据,而是返回一个新的二进制列“状态”,说明是否可以从用户那里提取数据。 “已保存”= 公开个人资料,“错误”= 私人个人资料。这很聪明,因为我可以过滤掉所有带有私有配置文件的 user_id,从而消除了在我发布的原始代码中使用 tryCatch()。再次感谢。
  • 如果我的回答对您有所帮助,请选择认可的解决方案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-22
  • 2021-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-05-24
  • 1970-01-01
  • 2011-06-09
相关资源
最近更新 更多