在 Sapply 函数中多次 Google 放置 API 次调用

Multiple Google Places API calls within Sapply function

我有一个位置列表,我正在将这些位置输入 Google 个地点 API。有些位置有超过 20 个结果。我在下面提供了一个这样的位置的示例。要获得前 20 个以外的结果,您必须额外 API 调用 Google Places,并使用从第一个 Google Places 获得的额外 "token" 参数 API打电话。

使用下面有缺陷的函数,我试图根据是否需要获得额外的结果来执行额外的 API 调用。当前函数产生 NULL 值。非常感谢任何有关更正此功能的帮助。

要输入 Sapply 的列表:

LatLongList <- as.list("42.36354942,-71.06396087")

应用函数:

library(RCurl)
library(tidyjson)
library(magrittr)
library(dplyr)

PullFromPlaces <- function(x) {

  url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&key=",key)
    payload_json <- getURL(url)

    next_page_token <- payload_json %>%        
      as.tbl_json %>% 
      enter_object("next_page_token")
      next_page_token <- as.character(attr(next_page_token,"JSON"))

      if (length(next_page_token) != 0) {

      url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key)
      payload_json <- getURL(url)

      }
}

应用执行:

Output <- sapply(LatLongList, PullFromPlaces)

我在 vignette of my googleway package

中有一个此类查询的示例
library(googleway)


api_key <- 'your_api_key'

myLocation <- c(42.36354942, -71.06396078)

myPlaces <- google_places(location = myLocation, 
                        radius = 500,
                        key = api_key)

nextPlaces <- google_places(location = myLocation,
                            radius = 500,
                            page_token = myPlaces$next_page_token, 
                            key = api_key)


myPlaces$results$name
# [1] "Boston"                                              "Kimpton Onyx Hotel"                                 
# [3] "Holiday Inn Express Hotel & Suites Boston Garden"    "Wyndham Boston Beacon Hill"                         
# [5] "The Boxer Boston Hotel"                              "Whole Foods Market"                                 
# [7] "The Liberty, a Luxury Collection Hotel, Boston"      "Massachusetts General Hospital"                     
# [9] "TD Garden"                                           "Sugarman, Rogers, Barshak & Cohen, P.C."            
# [11] "Dr. Richard J. Deasla, MD"                           "Massachussetts General Hospital"                    
# [13] "Massachusetts General Hospital: Temel Jennifer S MD" "Vrahas Mark Steven MD"                              
# [15] "Harry E. Rubash, MD"                                 "Dr. Ziv Williams, MD"                               
# [17] "CCRM Boston"                                         "Domino's Pizza"                                     
# [19] "Massachusetts General Hospital: Yeh Sunu Susan MD"   "North End"

nextPlaces$results$name
# [1] "Massachusetts General Hospital: Ryan Colleen MD"         "Warshaw Andrew L MD"                                    
# [3] "Massachusetts General Hospital: Althausen Anne M MD"     "Massachusetts General Hospital: Shipley William MD"     
# [5] "Massachusetts General Hospital: Feldman Adam S MD"       "Massachusetts General Hospital: Packard Swift Alison MD"
# [7] "Dr. Nahel Elias, MD"                                     "Dr. Steven L. Mcafee, MD"                               
# [9] "Dr. Charles A. Welch, MD"                                "Massachusetts General Hospital: Kilbride Ronan D MD"    
# [11] "Massachusetts General Hospital: Garasic Joseph Mich MD"  "Massachusetts General Hospital: Akins Cary W MD"        
# [13] "Dr. Edwin C. Huang, MD"                                  "Massachusetts General Hospital: Davis Benjamin T MD"    
# [15] "Massachusetts General Hospital: Levins Paul C MD"        "Massachusetts General Hospital: Passeri Jonathan MD"    
# [17] "Massachusetts General Hospital: Weil Michelle MD"        "Massachusetts General Hospital: Steele David John MD"   
# [19] "Massachusetts General Hospital: Chae Claudia U MD"       "Massachusetts General Hospital: Connolly Thomas Jose MD"

我明白了。下面是扔进 sapply 或 lapply 的函数。半径、类型和关键参数是预定义的。

library(jsonlite)
library(RCurl)
library(tidyjson)
library(magrittr)
library(stringr)
library(plyr)
library(dplyr)

PullFromPlaces <- function(x) {

      url = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&key=",key)
      payload_json <- getURL(url)

      next_page_token <- payload_json %>%        
        as.tbl_json %>% 
        enter_object("next_page_token") 
      next_page_token <- as.character(attr(next_page_token,"JSON"))

      if (length(next_page_token) == 0) {

        payload_json <- data.frame(payload_json,stringsAsFactors = FALSE)

      }   else {
        Sys.sleep(2)
        url2 = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key)
        payload_json2 <- getURL(url2)

        next_page_token <- payload_json2 %>%        
          as.tbl_json %>% 
          enter_object("next_page_token") 
        next_page_token <- as.character(attr(next_page_token,"JSON"))

        if (length(next_page_token) == 0) {

          payload_json <- rbind_pages(list(data.frame(payload_json,stringsAsFactors = FALSE),data.frame(payload_json2,stringsAsFactors = FALSE)))

        }   else {
          Sys.sleep(2)
          url3 = paste0("https://maps.googleapis.com/maps/api/place/nearbysearch/json?location=",x,"&radius=",radius_meters,"&types=",type,"&pagetoken=",next_page_token,"&key=",key)
          payload_json3 <- getURL(url3)

          payload_json <- rbind_pages(list(data.frame(payload_json,stringsAsFactors = FALSE),data.frame(payload_json2,stringsAsFactors = FALSE),data.frame(payload_json3,stringsAsFactors = FALSE)))

        } 

      }
    }