0

我正在循环通过一个 API 来匹配字符串并根据我自己的参考数据集标准化数据。在大多数情况下,API 会给出响应,并将结果填充到输出文件中。但是,当 API 返回 NULL 时,循环停止,我需要删除特定的字符串以使其再次运行。这是一个严重的迭代过程。有没有办法

  1. 查找 API 将返回 NULL 的字符串?这样的字符串可以在我们的数据中修复
  2. 在输出文件中为返回 NULL 的字符串填充 NULL 或 NA

我无法共享 API,因为它是在组织内部开发的,但会共享代码。

DESTINATIONS<- subset(DESTINATIONS, DESTINATIONS!="ABCDEF")


df <- data.frame()

for(i in 1:nrow(DESTINATIONS))
{
  
  location_url <- paste0(base_url, "destinations?name=", DESTINATIONS(DESTINATIONS))[i],specs)
  
  
  
destination_res <- GET(location_url)
   
destination_text <- content(destination_res, "text", encoding = "UTF-8")
  
location_df1 <- fromJSON(destination_text, flatten = TRUE)
  
location_df1 <- do.call(c, unlist(location_df1, recursive=FALSE))
  
location_df1 <- as.data.frame(t(location_df1))

coordinates_a <- select(location_df1, contains("items.country.name"))
  
coordinates_a <- coordinates_a %>% distinct() %>% t()
  
coordinates_a <- as.data.frame(coordinates_a)
  
coordinates_b <- select(location_df1, contains("items.id"))
  
coordinates_b <- coordinates_b %>% distinct() %>% t()
  
coordinates_b <- as.data.frame(coordinates_b)

coordinates <-  cbind.data.frame(coordinates_a, coordinates_b)

df <- rbind.data.frame(df, coordinates)}

简而言之,如果来自 DESTINATIONS 数据帧的字符串没有来自 API 的响应,则循环中断

感谢您提前提供的所有帮助。

4

1 回答 1

1

假设GET请求会返回NULL,您可以检查它的length.

尝试使用这样的东西:

data_list <- vector('list', nrow(DESTINATIONS))

for(i in 1:nrow(DESTINATIONS)) {
   location_url <- paste0(base_url, "destinations?name=", 
                          DESTINATIONS(DESTINATIONS))[i],specs)
   destination_res <- GET(location_url)
   if(length(destination_res) > 0) {
      destination_text <- content(destination_res, "text", encoding = "UTF-8")
      location_df1 <- fromJSON(destination_text, flatten = TRUE)
      location_df1 <- do.call(c, unlist(location_df1, recursive=FALSE))
      location_df1 <- as.data.frame(t(location_df1))
      coordinates_a <- select(location_df1, contains("items.country.name"))
      coordinates_a <- coordinates_a %>% distinct() %>% t()
      coordinates_a <- as.data.frame(coordinates_a)
      coordinates_b <- select(location_df1, contains("items.id"))
      coordinates_b <- coordinates_b %>% distinct() %>% t()
      coordinates_b <- as.data.frame(coordinates_b)
      coordinates <-  cbind.data.frame(coordinates_a, coordinates_b)
     }
   else coordinates <- NA
   data_lst[[i]] <- coordinates
}

现在,可以通过以下方式找到失败的请求:

which(is.na(data_lst))

并将数据绑定在一起,您可以删除这些NA值。

complete_data <- do.call(rbind, Filter(is.data.frame, data_lst))
于 2020-07-22T08:38:11.680 回答