Вы почти у цели. Есть пара вещей, необходимых для итерации функции get_forecast_for
по строкам. Из пакета purrr
функция pmap
хороша для повторения функции по строке, тогда как функция imap
может использоваться для повторения функции по ячейкам подряд.
Используя этот подход, я написал две функции: weather_at_coords
и weather
. weather_at_coords
используется для отправки запроса в DarkSkyAPI о погоде в указанном c местоположении в заданном диапазоне времени (т. Е. За последние десять дней). Функция weather
используется для повторения функции по строкам.
Я видел, что вы хотели вложенный объект daily
, поэтому написал функцию для извлечения этого списка из ответа. Я предполагаю, что вы также хотели получить результаты в data.frame, поэтому я добавил bind_rows
. Я добавил столбец id
, чтобы строки можно было правильно связать с местоположением (или вы можете добавить любые столбцы, которые вам нравятся).
# pkgs
library(tidyverse)
library(darksky)
# set API Key: free from https://darksky.net/dev
darksky::darksky_api_key()
# Forecast at a given point and time period
weather_at_coords <- function(...) {
d <- rlang::list2(...)
time <- seq(Sys.Date()-10, Sys.Date(), "1 day")
response <- imap(time, ~ darksky::get_forecast_for(d$lat, d$lon, .x, units = "si")[["daily"]])
out <- bind_rows(response) %>% mutate(id = d$id)
return(out)
}
# primary function (iterates across rows)
weather <- function(data) {
result <- pmap(data, ~ weather_at_coords(...))
return(bind_rows(result))
}
# sample data
d <- data.frame(
id = c("a", "b"),
lat = c(37.8267,34.8267),
lon = c(-122.423, -120.423)
)
# run
x <- weather(d)
x
Примечания
- Убедитесь, что у вас установлен пакет
rlang
- При необходимости измените имена переменных
lat
и lon
.