Markdown é uma linguagem simples de marcação que converte seu texto em HTML. É possível com o Rstudio gerar relatórios dinâmicos misturando Markdown com R através dos pacotes “rmarkdown” e “knitr”. Neste turorial vou mostrar algumas das estruturas do RMarkdown.

Antes de tudo verifique se você tem instalados os pacotes “rmarkdown” e “knitr”, pois a execução só funcionará se você tivé-los. É sempre necessário ter todos os pacotes dependentes para gerar o relatório instalados

Passos para criar e gerar um RMD

  • Passo 1: abra o Rstudio > file > New file > R Markdown > Title = Titulo do seu arquivo ; Author = Seu nome ; Output = HTML > OK

Obs: Na opção “Output” é possível definir outros formatos de saída para seu arquivo. Para ter um arquivo de saída PDF é preciso ter instalado em seu computador algum programa LaTeX. Eu particulamente prefiro salvar em HTML por ser mais prático e rápido, e em seguida converter o arquivo HTML final para PDF em algum site online, mas isso fica ao seu critério.

  • Passo 2: O Rstudio exibirá um exemplo de arquivo RMarkdown. Clique no botão “knitr” e veja se o Rstudio vai gerar uma página HTML do exemplo que será salva no mesmo diretório em que se encontra o seu arquivo .Rmd.

Estrutura do RMD

Antes de sair por aí tentando escrever relatórios com RMarkdown, é preciso entender a estrutura para não fazer um “frankenstein”. Vamos utilizar um exemplo que está no meu github e analisar sua estrutura para compreender o relatório dinâmico feito no RMarkdown, após compreender a estrutura, a tarefa de criar seu próprio RMD ficará fácil, pois basta apenas replicar a estrutura e fazer alterações personalizadas para o que você deseja fazer.

Baixe o relatório de exemplo aqui, descompacte e abra o arquivo exemploRMD.Rmd

Um arquivo RMarkdonw é composto basicamente por: cabeçalho, textos e saídas dinâmicas (r output). O nosso arquivo de exemplo RMD é um relatório em RMarkdown que contabiliza e expõe em forma de Treemap as palavras contidas nas versões da canção “O Que Será?” composta por Chico Buarque, portanto iremos compreender a estrutura de um relatório RMD baseado no exemplo. Certifique-se que todos os pacotes utilizados no relatório de exemplo estão instalados em seu computador, caso contrário, ocorrerá erro na criação da página HTML.

Cabeçalho

O cabeçalho é a parte mais importante do arquivo RMD, pois não pode faltar no arquivo. O cabeçalho é feito em YAML e deve ter este padão sempre, mudando apenas seus objetos como foi dito em “Passos para criar e gerar um RMD”.

---
title: "Exemplo RMD"
author: "Jordão Alves"
date: "12/10/2019"
output: html_document
---

Tamanho das letras

Na linguagem Markdown para alterar o tamanho das letras basta utilizar o # antes do texto. Quanto menos #, maior será o tamanho da fonte, a varição disso é:

# nível 1
## nível 2
### nível 3
#### nível 4
##### nível 5
###### nível 6

Parágrafos

Exemplo de delimitador de parágrafos:

<p>
Criando uma função que pega o conjunto de strings da letra da música e cria um Treemap das palavras disponíveis para sua plotagem. Repare que na função foram eliminados alguns conectivos para exibição das palavras ficarem mais claras.
<p>

Listagem

Para listar objetos você pode utilizar o -,+ ou *. Exemplo:

* O Que Será? (Abertura)
* O Que Será? (À flor da pele)
* O Que Será? (À Flor da Terra)

Citação

Para fazer uma citação utilize o >. Exemplo:

> Chico Buarque de Holanda

Pular linha

Para quebrar linha siga o exemplo abaixo:

> Será, que será? <br />
O que não tem certeza nem nunca terá <br />
O que não tem conserto nem nunca terá <br />
O que não tem tamanho <br />

O que é Code Chunk?

Basicamente Code Chunk é essa janela em que os exemplos anteriores foram mostrados. Em Markdown é possível colocar os códigos nessa janela para serem visualizados. Já em RMarkdown além da visualização dos códigos, é possível executa-los no momento da criação do relatório, daí o nome “Relatório dinâmico”. Por isso que o RMarkdown é uma ótima forma de criar relatórios, pois você gera tudo dentro dele mesmo.

Code Chunks do RMarkdown

Há diversos tipos de Code Chunks para diversas situações (recomendo conferir todos na documentação) nesse tutorial vou mostrar os que foram utilizados no exemplo dado, que geralmente são os casos mais comuns. Antes é preciso entender a sintaxe do Code Chunks do RMarkdown. Ele sempre será como o modelo abaixo mudando apenas o seu título e parâmetros.

ATENÇÃO: TODOS OS CODE CHUNKS DO RMARKDOWN DEVEM TER UM TÍTULO DIFERENTE PARA NÃO HAVER ERRO NA CRIAÇÃO DO ARQUIVO DE OUTPUT.

Como estou fazendo esse post em MD, então não posso criar um Code Chunk do Code Chunk. Sempre desconsiderar o * vindo antes dos ```

*```{r TMaFlorDaTerra, echo=TRUE,fig.height=4,fig.width=9,fig.align="center"}
vetorPalavras(aFlorDaTerra,"Treemap das palavras de 'O que será (À Flor da Terra)' ")
*```

Code Chunk oculto

Como estou fazendo esse post em MD, então não posso criar um Code Chunk do Code Chunk. Sempre desconsiderar o * vindo antes dos ```

O Code Chunk oculto é ideal para criar funções ou objetos dinâmicos para alimentar funções sem precisar mostra-los no arquivo de output, por exemplo:

*```{r letras, include=FALSE}
abertura <- "E todos os meu nervos estão a rogar
E todos os meus órgãos estão a clamar
E uma aflição medonha me faz implorar
O que não tem vergonha, nem nunca terá
O que não tem governo, nem nunca terá
O que não tem juízo
O que será que lhe dá
O que será meu nego, será que lhe dá
Que não lhe dá sossego, será que lhe dá
Será que o meu chamego quer me judiar
Será que isso são horas dele vadiar
Será que passa fora o resto da dia
Será que foi-se embora em má companhia
Será que essa criança quer me agoniar
Será que não se cansa de desafiar
O que não tem descanso, nem nunca terá
O que não tem cansaço, nem nunca terá
O que não tem limite
O que será que será
Que dá dentro da gente, que não devia
Que desacata a gente, que é revelia
Que é feito uma aguardente que não sacia
Que é feito estar doente de um folia
Que nem dez mandamentos vão conciliar
Nem todos os unguentos vão aliviar
Nem todos os quebrantos, toda alquimia
E nem todos os santos, será que será
O que não tem governo, nem nunca terá
O que não tem vergonha, nem nunca terá
O que não tem juízo"

aFlorDaPele <- "O que será que me dá
Que me bole por dentro, será que me dá
Que brota à flor da pele, será que me dá
E que me sobe às faces e me faz corar
E que me salta aos olhos a me atraiçoar
E que me aperta o peito e me faz confessar
O que não tem mais jeito de dissimular
E que nem é direito ninguém recusar
E que me faz mendigo, me faz suplicar
O que não tem medida, nem nunca terá
O que não tem remédio, nem nunca terá
O que não tem receita

O que será que será
Que dá dentro da gente e que não devia
Que desacata a gente, que é revelia
Que é feito uma aguardente que não sacia
Que é feito estar doente de uma folia
Que nem dez mandamentos vão conciliar
Nem todos os unguentos vão aliviar
Nem todos os quebrantos, toda alquimia
E nem todos os santos, será que será
O que não tem descanso, nem nunca terá
O que não tem cansaço, nem nunca terá
O que não tem limite

O que será que me dá
Que me queima por dentro, será que me dá
Que me perturba o sono, será que me dá
Que todos os tremores me vêm agitar
Que todos os ardores me vêm atiçar
Que todos os suores me vêm encharcar
Que todos os meus nervos estão a rogar
Que todos os meus órgãos estão a clamar
E uma aflição medonha me faz implorar
O que não tem vergonha, nem nunca terá
O que não tem governo, nem nunca terá
O que não tem juízo"

aFlorDaTerra <- "O que será, que será?
Que andam suspirando pelas alcovas
Que andam sussurrando em versos e trovas
Que andam combinando no breu das tocas
Que anda nas cabeças, anda nas bocas
Que andam acendendo velas nos becos
Que estão falando alto pelos botecos
E gritam nos mercados que com certeza
Está na natureza
Será, que será?
O que não tem certeza nem nunca terá
O que não tem conserto nem nunca terá
O que não tem tamanho
O que será, que será?
Que vive nas ideias desses amantes
Que cantam os poetas mais delirantes
Que juram os profetas embriagados
Que está na romaria dos mutilados
Que está na fantasia dos infelizes
Que está no dia a dia das meretrizes
No plano dos bandidos, dos desvalidos
Em todos os sentidos
Será, que será?
O que não tem decência nem nunca terá
O que não tem censura nem nunca terá
O que não faz sentido
O que será, que será?
Que todos os avisos não vão evitar
Por que todos os risos vão desafiar
Por que todos os sinos irão repicar
Por que todos os hinos irão consagrar
E todos os meninos vão desembestar
E todos os destinos irão se encontrar
E mesmo o Padre Eterno que nunca foi lá
Olhando aquele inferno vai abençoar
O que não tem governo nem nunca terá
O que não tem vergonha nem nunca terá
O que não tem juízo
O que será, que será?
Que todos os avisos não vão evitar
Por que todos os risos vão desafiar
Por que todos os sinos irão repicar
Por que todos os hinos irão consagrar
E todos os meninos vão desembestar
E todos os destinos irão se encontrar
E mesmo o Padre Eterno que nunca foi lá
Olhando aquele inferno vai abençoar
O que não tem governo nem nunca terá
O que não tem vergonha nem nunca terá
O que não tem juízo"

*```

Perceba que o título desse Code Chunk é “letras” e como parâmetro ele está configurado para não aparecer só output “include=FALSE”.

Code Chunk apenas códigos

Como estou fazendo esse post em MD, então não posso criar um Code Chunk do Code Chunk. Sempre desconsiderar o * vindo antes dos ```

Esse code chunk é ideal para mostrar seus códigos no relatório, pode ser usado para mostrar como foi feita uma função. Exemplo:

*```{r strings, echo=TRUE, message=FALSE, warning=FALSE}
library(stringr)
library(dplyr)
library(treemap)
vetorPalavras <- function(string,titulo){

## colocando tudo em minusculo
string <- str_to_lower(string)
## separando primeiramente por linha  
sepLinha <- str_split(string, fixed('\n'))
sepLinha <- paste(sepLinha[[1]],collapse = " ")
## removendo caracteres
sepLinha <- str_replace_all(sepLinha, "[,.!?]", "")
## separando por espaço
sepEspaco <- str_split(sepLinha, fixed(' '))
vetorPalavras <- as.factor(sepEspaco[[1]])

dados <- aggregate(x = vetorPalavras, 
                   by = list(palavras = vetorPalavras), 
                   FUN = length)

## filtrando os dados, eliminando algumas palavras conectivas
dadosFiltrados <- dados%>%
  filter( palavras != "a" & palavras != "o" & palavras != "as" & palavras != "os" &
          palavras != "é" & palavras != "e" & palavras != "são" & palavras != "à" &
          palavras != "da" & palavras != "das" & palavras != "do" & palavras != "dos" &
          palavras != "na" & palavras != "no" & palavras != "de" & palavras != "se" &
          palavras != "nas" & palavras != "nos" & palavras != "em" & palavras != "um" &
          palavras != "às" & palavras != "aos" & palavras != "ao" & palavras != "" )

treemap(dadosFiltrados,
        index="palavras",
        vSize="x",
        vColor="x",
        type="value",
        palette="RdYlBu",
        format.legend = list(scientific = FALSE, big.mark = " "
        ),title.legend="Número de palavras",
        title=titulo)
}
*```

Perceba que o título desse Code Chunk é “strings” e como parâmetro ele está configurado para aparecer somente os códigos, omitindo qualquer outra saída “echo=TRUE, message=FALSE, warning=FALSE”.

Code Chunk apenas saída

Como estou fazendo esse post em MD, então não posso criar um Code Chunk do Code Chunk. Sempre desconsiderar o * vindo antes dos ```

Esse code chunk é ideal para mostrar resultados como gráficos e tabelas. No exemplo abaixo foi utilizada a função mostrada acima feita para gerar um Treemap.

*```{r TMabertura, echo=FALSE,fig.height=4,fig.width=9,fig.align="center"}
vetorPalavras(abertura,"Treemap das palavras de 'O que será (Abertura)' ")
*```

Perceba que o título desse Code Chunk é “TMabertura” e como parâmetro ele está configurado para aparecer somente as saídas, omitindo a repetição do código “echo=FALSE,fig.height=4,fig.width=9,fig.align=‘center’ “. Repare também que nele é possível setar as configurações da saída da tabela/gráfico como: altura, comprimento e posição.

Code Chunk com saída e repetição de código

Como estou fazendo esse post em MD, então não posso criar um Code Chunk do Code Chunk. Sempre desconsiderar o * vindo antes dos ```

É bastante parecido com o exemplo anterior, diferindo apenas a repetição de código no output “echo=TRUE” em vez de “echo=FALSE”.

*```{r TMaFlorDaTerra, echo=TRUE,fig.height=4,fig.width=9,fig.align="center"}
vetorPalavras(aFlorDaTerra,"Treemap das palavras de 'O que será (À Flor da Terra)' ")
*```

Perceba que o título desse Code Chunk é “TMaFlorDaTerra” e como parâmetro ele está configurado para mostrar as saídas e a repetição do código “echo=TRUE,fig.height=4,fig.width=9,fig.align=‘center’ “. Repare também que nele é possível setar as configurações da saída da tabela/gráfico como: altura, comprimento e posição.

Agora que você já conhece o básico da estrutura de um RMD, já pode aplicar o que foi repassado nesse tutorial em seu próprio relatório!!!