Вызов API внутри оператора mutate в R - PullRequest
2 голосов
/ 13 июля 2020

Я пытаюсь определить время восхода в заданную дату, используя API

Итак, у меня есть такой фрейм данных

        Date
1 2018-01-03
2 2018-01-03
3 2018-01-04
4 2018-01-08
5 2018-01-09

И хотя я могу заставить его работать без оператора paste, когда я бросаю его в mutate, он не работает и возвращает ошибку:

dates <- structure(list(Date = c("2018-01-03", "2018-01-03", "2018-01-04", 
"2018-01-08", "2018-01-09")), row.names = c(NA, 5L), class = "data.frame")


dates %>% 
  mutate(sunrise = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=", Date))$content))$results[1])
           )

ERROR:
Error: Problem with `mutate()` input `sunrise`.
x length(url) == 1 is not TRUE
i Input `sunrise` is `as.character(...)`.

Какова здесь цель? Я хочу создать новый столбец восходов для каждый день. Он отлично работает, если я изменяю поле paste0 и даю ему точную строку, но не в mutate, и я не могу понять, почему ...

Ответы [ 2 ]

2 голосов
/ 13 июля 2020

Другой вариант: map из purrr

library(dplyr)
library(purrr)
library(jsonlite)
dates %>%
     mutate(sunrise = map_chr(sprintf("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=%s", Date), 
         ~ as.character(fromJSON(rawToChar(GET(.x)$content))$results[1])))
#        Date     sunrise
#1 2018-01-03 12:19:53 PM
#2 2018-01-03 12:19:53 PM
#3 2018-01-04 12:19:52 PM
#4 2018-01-08 12:19:27 PM
#5 2018-01-09 12:19:15 PM

данные

dates <- structure(list(Date = c("2018-01-03", "2018-01-03", "2018-01-04", 
"2018-01-08", "2018-01-09")), row.names = c(NA, 5L), class = "data.frame")
2 голосов
/ 13 июля 2020

Это можно сделать с помощью dplyr::rowwise

library(dplyr)
library(httr)
library(jsonlite)

dates <- structure(list(Date = c("2018-01-03", "2018-01-03", "2018-01-04", 
                                 "2018-01-08", "2018-01-09")), row.names = c(NA, 5L), class = "data.frame")

dates %>% 
  rowwise() %>% 
  mutate(sunrise = as.character(fromJSON(rawToChar(GET(paste0("https://api.sunrise-sunset.org/json?lat=40.730610&lng=-73.935242&date=",Date))$content))$results[1]))
#> # A tibble: 5 x 2
#> # Rowwise: 
#>   Date       sunrise    
#>   <chr>      <chr>      
#> 1 2018-01-03 12:19:53 PM
#> 2 2018-01-03 12:19:53 PM
#> 3 2018-01-04 12:19:52 PM
#> 4 2018-01-08 12:19:27 PM
#> 5 2018-01-09 12:19:15 PM
...