start_time <- Sys.time()
Automação de execução de arquivos RMarkdown no Ruindow$
Neste post mostro como automatizar o agendamento e a execução de documentos RMarkdown no R usando um script R (arquivo.R) com o Task Scheduler no Windows.
library(DiagrammeR)
grViz(diagram = "digraph flowchart {
# define node aesthetics
node [fontname = Arial, shape = oval, color = Lavender, style = filled]
tab1 [label = '@@1']
tab2 [label = '@@2']
tab3 [label = '@@3']
# set up node layout
tab1 -> tab2;
tab2 -> tab3
}
[1]: 'Escrita do(s) seu(s) documento(s) RMarkdown'
[2]: 'Chamada da execução do(s) documento(s) RMarkdown via R script'
[3]: 'Agendamento da execução via Task Scheduler'
")
A primeira etapa consiste na simples criação de seus documentos no RMarkdown. Você pode escrever somente um ou pode colocar vários deles dentro de um único .Rmd que chamará a execução sequenciada de todos os documentos que você desejar executar.
Vamos inserir aqui um exemplo reprodutível no caso de vários Rmd´s em que iremos agendar a execução sequenciada de todos os eles diariamente:
Update_Milho.Rmd
)
---
title: "Primeiro .Rmd: Atualiza dados de commodities: Milho"
author: "Seu Nome aqui"
date: "Last Update: `r format(Sys.time(), '%B %d, %Y %H:%M:%S')`"
output:
html_document:
df_print: paged
---
```{r }
start_time <- Sys.time()
```
```{r include=FALSE }
# Chunk de setup
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE,
comment = NA
)
knitr::opts_chunk$set(comment = NA) # Remove all coments # of R outputs
knitr::opts_chunk$set(warning = FALSE) # Remove all warnings # of R outputs
knitr::opts_chunk$set(message = FALSE) # Remove all messages # of R outputs
```
***
<style>
p.comment {
background-color: #DBDBDB;
padding: 10px;
border: 1px solid black;
margin-left: 25px;
border-radius: 5px;
font-style: italic;
}
</style>
<div class="alert alert-info">
<strong> Update das cotações do milho na CBOT </strong>
</div>
***
# Pacotes
```{r}
library(BatchGetSymbols)
library(tidyverse)
library(dplyr)
library(fpp3)
library(feasts)
library(plotly)
library(ggplot2)
```
# Download dos dados
```{r}
Cotacoes_Milho_CBOT <- BatchGetSymbols(
tickers = "ZC=F", # Futuros Milho
first.date = "2019-01-01",
last.date = Sys.Date(),
do.cache = FALSE
)
Cotacoes_Milho_CBOT <- as.data.frame(Cotacoes_Milho_CBOT$df.tickers) %>%
as_tsibble(index = ref.date)
milho <- Cotacoes_Milho_CBOT %>%
select(
ticker,
ref.date,
price.adjusted,
volume,
ret.adjusted.prices
) %>%
as_tsibble(index = ref.date)
```
# Preview dos preços e seus retornos
```{r fig.width=9, fig.height=4}
ggplotly(
autoplot( milho, price.adjusted )
)
ggplotly(
autoplot( milho, ret.adjusted.prices )
)
ggplotly(
autoplot( milho, volume )
)
# autoplot(milho[, c("price.adjusted", "ret.adjusted.prices", "volume")], facets = TRUE)
```
# Gera csv
```{r}
write.csv(milho, "milho.csv", row.names = FALSE )
```
***
```{r}
# Execution timing
Sys.time() - start_time # Checar se esse timer soma todos os tempos de execução de cada documento
Sys.info()
memuse::Sys.meminfo()
```
Update_Soja.Rmd
)
---
title: "Atualiza dados de commodities: Soja"
author: "Seu Nome aqui"
date: "Last Update: `r format(Sys.time(), '%B %d, %Y %H:%M:%S')`"
output:
html_document:
df_print: paged
---
```{r }
start_time <- Sys.time()
```
```{r include=FALSE }
# Chunk de setup
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE,
comment = NA
)
knitr::opts_chunk$set(comment = NA) # Remove all coments # of R outputs
knitr::opts_chunk$set(warning = FALSE) # Remove all warnings # of R outputs
knitr::opts_chunk$set(message = FALSE) # Remove all messages # of R outputs
```
***
<style>
p.comment {
background-color: #DBDBDB;
padding: 10px;
border: 1px solid black;
margin-left: 25px;
border-radius: 5px;
font-style: italic;
}
</style>
<div class="alert alert-info">
<strong> Update das cotações do Soja na CBOT </strong>
</div>
***
# Pacotes
```{r}
library(BatchGetSymbols)
library(tidyverse)
library(dplyr)
library(fpp3)
library(feasts)
library(plotly)
library(ggplot2)
```
# Download dos dados
```{r}
Cotacoes_Soja_CBOT <- BatchGetSymbols(
tickers = "ZL=F", # Futuros Soja
first.date = "2019-01-01",
last.date = Sys.Date(),
do.cache = FALSE
)
Cotacoes_Soja_CBOT <- as.data.frame(Cotacoes_Soja_CBOT$df.tickers) %>%
as_tsibble(index = ref.date)
head(Cotacoes_Soja_CBOT)
Soja <- Cotacoes_Soja_CBOT %>%
select(
ticker,
ref.date,
price.adjusted,
volume,
ret.adjusted.prices
) %>%
as_tsibble(index = ref.date)
```
# Preview dos preços e seus retornos
```{r fig.width=9, fig.height=4}
ggplotly(
autoplot( Soja, price.adjusted )
)
ggplotly(
autoplot( Soja, ret.adjusted.prices )
)
ggplotly(
autoplot( Soja, volume )
)
# autoplot(Soja[, c("price.adjusted", "ret.adjusted.prices", "volume")], facets = TRUE)
```
# Gera csv
```{r}
write.csv(Soja, "Soja.csv", row.names = FALSE )
```
***
```{r}
# Execution timing
Sys.time() - start_time # Checar se esse timer soma todos os tempos de execução de cada documento
Sys.info()
memuse::Sys.meminfo()
```
Update_Aveia.Rmd
)---
title: "Atualiza dados de commodities: Aveia"
author: "Seu Nome aqui"
date: "Last Update: `r format(Sys.time(), '%B %d, %Y %H:%M:%S')`"
output:
html_document:
df_print: paged
---
```{r }
start_time <- Sys.time()
```
```{r include=FALSE }
# Chunk de setup
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE,
comment = NA
)
knitr::opts_chunk$set(comment = NA) # Remove all coments # of R outputs
knitr::opts_chunk$set(warning = FALSE) # Remove all warnings # of R outputs
knitr::opts_chunk$set(message = FALSE) # Remove all messages # of R outputs
```
***
<style>
p.comment {
background-color: #DBDBDB;
padding: 10px;
border: 1px solid black;
margin-left: 25px;
border-radius: 5px;
font-style: italic;
}
</style>
<div class="alert alert-info">
<strong> Update das cotações do Aveia na CBOT </strong>
</div>
***
# Pacotes
```{r}
library(BatchGetSymbols)
library(tidyverse)
library(dplyr)
library(fpp3)
library(feasts)
library(plotly)
library(ggplot2)
```
# Download dos dados
```{r}
Cotacoes_Aveia_CBOT <- BatchGetSymbols(
tickers = "ZO=F", # Futuros Aveia
first.date = "2019-01-01",
last.date = Sys.Date(),
do.cache = FALSE
)
Cotacoes_Aveia_CBOT <- as.data.frame(Cotacoes_Aveia_CBOT$df.tickers) %>%
as_tsibble(index = ref.date)
head(Cotacoes_Aveia_CBOT)
Aveia <- Cotacoes_Aveia_CBOT %>%
select(
ticker,
ref.date,
price.adjusted,
volume,
ret.adjusted.prices
) %>%
as_tsibble(index = ref.date)
```
# Preview dos preços e seus retornos
```{r fig.width=9, fig.height=4}
ggplotly(
autoplot( Aveia, price.adjusted )
)
ggplotly(
autoplot( Aveia, ret.adjusted.prices )
)
ggplotly(
autoplot( Aveia, volume )
)
# autoplot(Aveia[, c("price.adjusted", "ret.adjusted.prices", "volume")], facets = TRUE)
```
# Gera csv
```{r}
write.csv(Aveia, "Aveia.csv", row.names = FALSE )
```
***
```{r}
# Execution timing
Sys.time() - start_time # Checar se esse timer soma todos os tempos de execução de cada documento
Sys.info()
memuse::Sys.meminfo()
```
Salve cada um desses .Rmd´s na mesma pasta para facilitar a chamada das execuções.
Em seguida, criaremos mais um .Rmd que irá chamar a execução sequenciada de cada um dos documentos criados anteriormente:
Update_Milho.Rmd
Update_Soja.Rmd
Update_Aveia.Rmd
Executa_a_atualizacao_das_3_commodities.Rmd
)Agora que criamos todos os três documentos .Rmd´s criamos um que executa os três sequencialmente:
---
title: "Script de agregação das execuções dos updates dos dados de commodities"
author: "Seu Nome aqui"
date: "Last Update: `r format(Sys.time(), '%B %d, %Y %H:%M:%S')`"
output:
html_document:
df_print: paged
---
```{r }
start_time <- Sys.time()
```
```{r include=FALSE }
# Chunk de setup
knitr::opts_chunk$set(
echo = TRUE,
message = FALSE,
warning = FALSE,
comment = NA
)
knitr::opts_chunk$set(comment = NA) # Remove all coments # of R outputs
knitr::opts_chunk$set(warning = FALSE) # Remove all warnings # of R outputs
knitr::opts_chunk$set(message = FALSE) # Remove all messages # of R outputs
```
***
<style>
p.comment {
background-color: #DBDBDB;
padding: 10px;
border: 1px solid black;
margin-left: 25px;
border-radius: 5px;
font-style: italic;
}
</style>
<div class="alert alert-info">
<strong> Update das cotações de commodities </strong>
</div>
***
Listemos os .Rmd´s disponíveis no diretório:
```{r}
lista_rmd_files <- list.files(pattern = ".Rmd$")
lista_rmd_files
```
```{r}
cat("Iniciando a execução dos Rmds que atualizam as cotações das commodities...")
```
```{r child = 'Update_Milho.Rmd'}
```
```{r child = 'Update_Soja.Rmd'}
```
```{r child = 'Update_Aveia.Rmd'}
```
***
```{r}
cat("...contabilizando o tempo total de execução dos três Rmds sequencialmente...Fim!")
# Execution timing
Sys.time() - start_time
Sys.info()
memuse::Sys.meminfo()
```
O terceiro e último passo consiste nas configurações dos agendamentos pelo Task Scheduler do Windows.
No menu Pesquisar da barra do Windows digite Agendador de Tarefas e abra ele;
Clique em Ação e em seguida em Criar Tarefa…
Crie um nome e insira uma descrição para a sua tarefa e;
Na aba Ações vá em Novo…
Deixe a opção marcada Iniciar um Programa
Navegue nas pastas do Windows onde os binários da linguagem R ficam instaladas…
Clique em Rscript.exe e com o Shift pressionado, clique com o outro botão do mouse e selecione a opção Copiar como caminho
Atualiza_Dados_Commodities.R
```{r}
cat("Inicia a execução da atualização das commodities ...")
Sys.getenv("RSTUDIO_PANDOC") # Cheque a versão e local do seu pandoc
# Copie esse output gerado (path)
library(rmarkdown)
Sys.setenv(RSTUDIO_PANDOC = "C:/Program Files/RStudio/bin/quarto/bin") # Insira o path copiado dentro dessas aspas...
cat("Começando o update das cotações ... ")
rmarkdown::render(
input = "C:/Users/rodri/Documents/Scripts do R/Exemplo_Task_Scheduler/Executa_a_atualizacao_das_3_commodities.Rmd", # Documento RMarkdown que chama a execução sequencial dos três outros Rmds
output_file = "C:/Users/rodri/Documents/Scripts do R/Exemplo_Task_Scheduler/Executa_a_atualizacao_das_3_commodities.html", # O mesmo path do documento RMarkdown acima, só que com formato .html
output_dir = "C:/Users/rodri/Documents/Scripts do R/Exemplo_Task_Scheduler" # A mesma pasta onde os Rmd´s estão localizados
)
cat("Fim da atualização dos dados ...")
```
Por fim, agende as frequências das atualizações das execuções (via script R sozinho), de acordo com a sua necessidade.
MacKintosh,J. Scheduling Rmarkdown files on Windows – your foolproof guide, In \(<\) r-bloggers \(>\)
StackOverFlow How to combine two RMarkdown Rmd Files into a single output ? In \(<\) stackoverflow.com \(>\)
Total execution timing:
# Execution timing
Sys.time() - start_time
Time difference of 0.6338298 secs
Sys.info()
sysname release version nodename
"Windows" "10 x64" "build 19044" "LAPTOP-EVMN6V5C"
machine login user effective_user
"x86-64" "rodri" "rodri" "rodri"
memuse::Sys.meminfo()
Totalram: 7.819 GiB
Freeram: 1.050 GiB