Usando o cronR para Agendar Scripts

Por Caio em 13/11/2017

Nem sempre os dados que precisamos para uma análise podem ser encontrados em uma base consolidada. Muitas vezes as informações que queremos não estão imediatamente disponíveis e precisam ser coletadas com o tempo através de um processo lento e monótono.

Imagine, por exemplo, que quiséssemos baixar os dados meteorológicos das maiores cidades do mundo a cada 12 horas para uma análise sobre previsões do tempo. Um programador desavisado talvez criasse alarmes em seu relógio e para baixar as tabelas necessárias quando eles tocassem.

Mas isso não parece uma boa estratégia, certo?

DarkSky

Para demonstrar uma alternativa a este método, vamos usar um serviço de previsões do tempo chamado DarkSky. Esta plataforma ficou conhecida recentemente pela sua precisão incrível e pelo seu aplicativo extremamente bem feito, mas uma coisa que poucos sabem é que a DarkSky também disponibiliza uma API para qualquer um interessado em dados meteorológicos.

Para a nossa sorte, o hrbrmstr já criou uma interface em R para essa API que pode ser instalada facilmente com o comando abaixo:

# install.packages("devtools")
devtools::install_github("hrbrmstr/darksky")

Depois de instalado o pacote, vá para o portal do desenvolvedor da DarkSky, crie uma conta e obtenha uma chave secreta para acessar a API.

Sys.setenv(DARKSKY_API_KEY = "SUA CHAVE SECRETA")

Baixando os dados

O primeiro passo da nossa análise é determinar as latitudes e longitudes das maiores cidades do mundo para que possamos pedir as previsões do tempo destas coordenadas.

Com o pacote maps podemos fazer isso de uma maneira bastante simples:

forecasts <- maps::world.cities %>%
  dplyr::as_tibble() %>%
  dplyr::filter(pop > 2000000) %>%
  dplyr::rename(country = country.etc) %>%
  dplyr::select(name, country, lat, long) %>%
  dplyr::mutate(
    currently = list(""),
    hourly = list(""),
    daily = list(""))

No trecho de código acima pegamos todas as cidades com mais de 2 milhões de habitantes (juntamente com suas localizações) da base maps::world.cities. As últimas 4 linhas são uma preparação para a obtenção das previsões do tempo que faremos logo a seguir:

for (i in 1:nrow(forecasts)) {
  forecast <- darksky::get_current_forecast(forecasts$lat[i], forecasts$long[i])
  forecasts$currently[i] <- forecast$currently %>% dplyr::as_tibble() %>% list()
  forecasts$hourly[i] <- forecast$hourly %>% dplyr::as_tibble() %>% list()
  forecasts$daily[i] <- forecast$daily %>% dplyr::as_tibble() %>% list()
}

Na coluna currently guardamos o estado meteorológico atual da cidade, enquanto em hourly e daily colocamos as previsões do tempo para as próximas 48 horas e para os próximos 7 dias respectivamente. Agora só resta salvar isso tudo em um arquivo RDS:

file <- lubridate::now() %>%
  lubridate::ymd_hms() %>%
  as.character() %>%
  stringr::str_replace_all("[-: ]", "_") %>%
  stringr::str_c(".rds") 

readr::write_rds(forecasts, stringr::str_c("DIRETÓRIO DOS ARQUIVOS", file))

cronR

Perceba que o script descrito na seção anterior não depende de nenhum input do programador e pode ser rodado automaticamente. Agora só nos resta automatizar essa execução, tarefa que realizaremos com o pacote cronR. Ele funciona nas plataformas Mac e Linux e pode ser instalado com o comando a seguir:

install.packages("cronR")

Esse pacote nos permite agendar a execução de qualquer comando para que ela ocorra a cada tantos minutos/horas/dias/… Certifique-se de que você está em uma máquina ou servidor que não será desligado, verifique se o cron daemon está ativo e agende a execução do nosso script:

cmd <- cronR::cron_rscript("CAMINHO PARA SCRIPT")

cronR::cron_add(cmd, "daily", "12AM")
cronR::cron_add(cmd, "daily", "12PM")

E isso é tudo! No meu caso, agendei o script para executar diariamente às 00:00 e às 12:00, mas a frequência das chamadas fica a seu critério (lembrando apenas que o plano gratuito da API do DarkSky só permite 1000 chamadas por dia). Para saber mais sobre como mudar a frequência das execuções, consulte a documentação do cronR.

Conclusão

Como vimos, não é difícil agendar a execução de um script. A maior parte do nosso trabalho é criar um código que funcione independentemente do programador (por exemplo nomeando os arquivos gerados automaticamente), mas depois disso é só chamar cronR::cron_rscript() e cronR::cron_add().

No meu próximo post usarei os dados baixados com esse tutorial para uma análise sobre previsões meteorológicas, então fique ligado na parte dois!

P.S.: Se você quiser o código completo do meu arquivo get_forecasts.R, disponibilizei ele como um Gist. Além disso, também disponibilizei uma versão em inglês deste post no meu blog pessoal. Abraços!

comments powered by Disqus

Nossa Newsletter

Uma vez por semana enviamos um e-mail para você não perder nenhum post da Curso-R. Avisamos também sempre que abrimos uma nova turma.