peso <- 70
altura <- 1.75
peso / altura^2[1] 22.85714
Markdown, equações e citações em um documento reprodutível
Parte I · Documentos e linguagem
Em 2004, John Gruber publicou o Markdown, uma convenção para escrever texto formatado usando apenas sinais de pontuação: asteriscos para ênfase, cerquilhas para títulos, hifens para listas. O arquivo continua legível como texto puro e pode ser convertido em HTML por um programa. Vinte anos depois, essa convenção está em quase toda ferramenta de escrita técnica, do GitHub aos assistentes de inteligência artificial.
O Quarto leva a ideia um passo adiante. Num arquivo .qmd, o texto em Markdown convive com blocos de código R que são executados no momento da renderização; os resultados, sejam números, tabelas ou gráficos, entram no documento final. O produto é um documento reprodutível (reproducible document): qualquer pessoa com o arquivo e os dados regenera o relatório inteiro, sem copiar e colar resultados. É assim que todos os Labs desta disciplina foram escritos, e é assim que você escreverá seus relatórios.
Você precisa do R e do Positron instalados. O Positron é o editor de ciência de dados da Posit, e já traz o Quarto embutido; só o R precisa ser instalado à parte.
labs-r, e clique em Create. O Positron abre a pasta nova..qmd dentro da pasta, por exemplo relatorio.qmd.title: "Meu relatório" e format: html.O arquivo HTML fica na mesma pasta do .qmd, com o mesmo nome: relatorio.qmd gera relatorio.html, que abre em qualquer navegador e pode ser enviado por e-mail.
A pasta aberta no Positron é a pasta de trabalho (working directory) do R: todos os caminhos de dados, imagens e scripts passam a ser relativos a ela. Um .qmd aberto solto, sem pasta, faz o R procurar os arquivos onde estiver, e o mesmo código funciona num computador e falha em outro. Uma pasta por trabalho, aberta com File > Open Folder…, e o .qmd sempre dentro dela.
O Positron mostra o .qmd como texto, com o Markdown cru, que é o que este Lab ensina. Há também um modo visual, com o texto já formatado: abra a paleta de comandos (Help > Show All Commands, ou Cmd+Shift+P) e execute Quarto: Edit in Visual Mode; o mesmo comando volta ao modo texto. Baixe o .qmd deste Lab pelo botão no topo da página, abra-o no Positron e compare o fonte com o resultado: é a forma mais rápida de aprender a sintaxe.
A ênfase é marcada com asteriscos ao redor do trecho; sobrescrito e subscrito usam acento circunflexo e til.
| Sintaxe | Resultado |
|---|---|
*itálico* |
itálico |
**negrito** |
negrito |
***itálico e negrito*** |
itálico e negrito |
x^2^ |
x2 |
H~2~O |
H2O |
~~riscado~~ |
|
`código` |
código |
Um parágrafo é separado do seguinte por uma linha em branco. Uma quebra de linha simples dentro do parágrafo desaparece no resultado; para forçar a quebra, termine a linha com uma barra invertida (\).
Um título começa com uma ou mais cerquilhas (#) seguidas de espaço. O número de cerquilhas define o nível:
Por convenção, o nível 1 fica reservado ao título do documento, que o Quarto gera a partir do campo title do cabeçalho. As seções do texto começam em ##, e as subseções em ###. Os títulos alimentam o sumário automático (“Nesta página”, à direita); por isso o exemplo acima está num bloco de código, e não em títulos reais, que poluiriam o sumário deste Lab.
Listas não ordenadas usam -; listas ordenadas usam números seguidos de ponto. Para aninhar, recue o item com quatro espaços.
Uma lista de tarefas (task list) usa - [ ] para item pendente e - [x] para item concluído:
Uma lista colada ao parágrafo anterior, sem linha em branco entre eles, é lida como continuação do parágrafo. Se os itens aparecerem emendados na mesma linha, a causa é essa.
Um link tem o texto entre colchetes e o endereço entre parênteses: [Quarto](https://quarto.org) produz Quarto. Um endereço entre sinais de menor e maior vira link com o próprio endereço como texto: <https://quarto.org> produz https://quarto.org.
A imagem usa a mesma sintaxe com um ponto de exclamação na frente; o texto entre colchetes vira a legenda.
Repare no ../ do caminho. Este .qmd está na pasta labs/, e a imagem está em images/, uma pasta irmã. Os dois pontos significam “suba um nível”; o caminho é sempre relativo ao arquivo que está sendo escrito. O atributo width controla a largura, e o fig-alt descreve a imagem para leitores de tela e para buscadores. Inclua-o sempre.
A tabela pipe (pipe table) separa as colunas com barras verticais. A segunda linha, feita de hifens, marca o cabeçalho; dois-pontos nela definem o alinhamento de cada coluna: :-- à esquerda, :-: centralizado, --: à direita.
| Sinal vital | Valor | Unidade |
|---|---|---|
| Pressão arterial | 120/80 | mmHg |
| Frequência cardíaca | 72 | bpm |
| Temperatura axilar | 36,5 | °C |
| Saturação de O2 | 98 | % |
As barras não precisam estar alinhadas no fonte; o alinhamento visual só facilita a leitura. Números ficam melhores alinhados à direita, porque as casas decimais se sobrepõem.
Uma nota de rodapé tem duas partes: a marca no texto, [^1], e a definição, [^1]: texto, em qualquer lugar do documento. Uma nota inline dispensa a definição separada: ^[texto da nota].
O IMC foi proposto por Quetelet1 no século XIX. Hoje é a medida antropométrica mais usada2.
O rótulo entre colchetes pode ser um número ou uma palavra; o Quarto renumera as notas na ordem em que aparecem.
Há dois tipos de bloco de código, e a diferença entre eles é o centro deste Lab.
Três crases abrem e fecham o bloco; o nome da linguagem depois das crases liga o realce de sintaxe. O código é mostrado, mas não executado.
Serve para mostrar código que não deve rodar: um exemplo com erro proposital, um comando de instalação como install.packages() ou um trecho de outra linguagem.
Com a linguagem entre chaves, {r}, o bloco vira um chunk: o R executa o código durante a renderização e insere o resultado logo abaixo.
O código aparece com fundo cinza, e o resultado, precedido por [1], vem em seguida. Se você mudar o peso e renderizar de novo, o resultado muda junto. É isso que torna o documento reprodutível.
As opções vão nas primeiras linhas do chunk, cada uma iniciada por #|. As quatro mais usadas:
#| label: nome dá nome ao chunk. Facilita achar erros e é obrigatório para figuras referenciadas no texto.#| echo: false esconde o código e mostra só o resultado.#| eval: false mostra o código e não o executa.#| warning: false suprime os avisos do R na saída.Um exemplo com echo: false: o leitor vê o resultado sem ver o código que o produziu.
[1] 22.9
Observe que peso e altura continuam existindo: os chunks de um mesmo documento compartilham a sessão do R e são executados na ordem em que aparecem.
Quando a renderização falha, a mensagem de erro cita o rótulo do chunk. Com rótulos como imc-exemplo, você vai direto ao problema; sem eles, o Quarto informa algo como unnamed-chunk-7.
Há um terceiro tipo, raro: o bloco de conteúdo bruto (raw content), aberto com ```{=html}, cujo conteúdo é copiado tal como está para o arquivo final, sem passar pelo Markdown.
Equações usam a notação do LaTeX, o sistema de tipografia científica. Entre cifrões simples a equação fica na linha (inline): $E = mc^2$ produz \(E = mc^2\). Entre cifrões duplos ela ganha uma linha própria, centralizada (display):
\[ E = mc^2 \]
Frações usam \frac{numerador}{denominador}; letras gregas têm nome próprio (\mu, \sigma, \pi); chaves agrupam o que vai no expoente ou no índice. A densidade da distribuição normal:
\[ f(x) = \frac{1}{\sigma \sqrt{2\pi}} \, e^{-\frac{(x - \mu)^2}{2\sigma^2}} \]
E o índice de massa corporal, calculado no chunk acima. O comando \text{} mantém as palavras em fonte normal, em vez do itálico matemático:
\[ \text{IMC} = \frac{\text{peso}}{\text{altura}^2} \]
No HTML, quem desenha as equações é o MathJax, uma biblioteca JavaScript carregada pelo navegador. A equação continua sendo texto: pode ser selecionada, copiada e lida por leitores de tela.
O $ é o interruptor do modo matemático. Num parágrafo com dois cifrões, como valores em reais, o Quarto pode interpretar o trecho entre eles como equação e embaralhar o resultado. Para escrever um cifrão literal, escape-o com barra invertida: R\$ 50 produz R$ 50.
Um div é uma região de conteúdo delimitada por linhas de três dois-pontos, com uma classe ou atributo na abertura. Um span faz o mesmo com um trecho dentro da linha: o texto entre colchetes seguido da classe entre chaves. O selo “Parte I · Documentos e linguagem” no topo deste Lab é um span com a classe .topic-badge.
Este parágrafo ganha uma borda.
Um trecho em cinza e menor dentro da frase.
Divs e spans não fazem nada sozinhos: são ganchos para o CSS do site. O uso mais comum são os callouts, blocos de destaque com ícone e cor, que o Quarto traz prontos em cinco tipos. Cada um é um div com a classe .callout- seguida do tipo; um título de nível 2 na primeira linha vira o cabeçalho do bloco.
No R, uma variável categórica é um factor. Muitas vezes é preciso declará-la explicitamente com as.factor(), sobretudo quando os níveis foram codificados com números.
Crie e abra a pasta do projeto no Positron antes de começar qualquer trabalho. Ela fixa a pasta de trabalho e mantém dados, código e relatório juntos.
O R segue a convenção da língua inglesa: o separador decimal é o ponto. 1,75 não é um número e meio; é uma sequência de dois valores, 1 e 75.
O R distingue maiúsculas de minúsculas. Uma variável chamada Sexo e outra chamada sexo são objetos diferentes, e o erro object not found costuma vir daí.
Carregue com library() todos os pacotes de que o documento precisa no primeiro chunk. Evite carregar pacotes que não serão usados: funções de mesmo nome em pacotes diferentes entram em conflito.
Os papéis que este material dá a cada tipo: note para nuances, tip para lições, warning para armadilhas conceituais, caution para cuidados práticos, important para regras.
Um callout pode nascer fechado, com o atributo collapse="true"; o leitor clica no título para abrir. É o formato das respostas dos exercícios na seção Pratique.
O conteúdo só aparece depois do clique.
Uma citação em bloco (blockquote) começa cada linha com >. Dentro dela cabe qualquer outro elemento Markdown, inclusive títulos e ênfase.
Dois lemas do R
Everything that exists is an object.
Everything that happens is a function call.John Chambers, um dos criadores da linguagem S
Tudo o que existe é um objeto; tudo o que acontece é uma chamada de função. O R descende da linguagem S, e os dois lemas de Chambers voltam no Lab 03, quando examinarmos objetos e funções de perto.
| Sintaxe | Resultado | Uso |
|---|---|---|
-- |
– | meia-risca (en dash): intervalos, como 1996–2024 |
--- |
— | travessão (em dash) |
... |
… | reticências |
"aspas" |
“aspas” | aspas curvas, convertidas automaticamente |
\* |
* | asterisco literal, sem ativar o itálico |
|
10 mg | espaço que não quebra linha entre número e unidade |
Citar no Quarto exige duas coisas: um arquivo de referências e uma chave para cada obra.
O arquivo .bib é um texto no formato BibTeX, em que cada entrada tem um tipo (@book, @article, @misc), uma chave única e campos como autor, título e ano.
Num documento avulso, o caminho do arquivo vai no cabeçalho YAML, ao lado do título: bibliography: referencias.bib. Neste site, ele está declarado uma única vez, no arquivo de configuração _quarto.yml, e vale para todos os Labs. Um segundo campo, csl, aponta para o estilo de citação; aqui usamos o Vancouver, padrão das revistas médicas.
A citação é a chave precedida de @. Os colchetes, o sinal de menos e o texto depois da vírgula mudam o que aparece no documento.
| Sintaxe | Resultado | O que faz |
|---|---|---|
[@wickham2023r4ds] |
(1) | citação entre parênteses, no fim da frase |
@wickham2023r4ds |
(1) | citação narrativa: o autor faz parte da frase |
[-@wickham2023r4ds] |
(1) | suprime o nome do autor, quando ele já foi escrito |
[@gruber2004markdown; @allaire2022quarto] |
(2,3) | várias obras de uma vez |
[@xie2018rmarkdown, p. 15] |
(4) | com localizador de página |
As três primeiras linhas produzem o mesmo resultado nesta página. O Vancouver é um estilo numérico: cada obra recebe um número na ordem em que é citada pela primeira vez, o mesmo número se repete nas citações seguintes, e o nome do autor nunca aparece na citação. A distinção entre as três formas só se vê num estilo autor-data, como o APA: [@wickham2023r4ds] vira “(Wickham et al., 2023)”, @wickham2023r4ds vira “Wickham et al. (2023)” e [-@wickham2023r4ds] vira “(2023)”.
A lista completa, formatada, é montada pelo Quarto no fim do documento, na seção “Referências”, sem que você digite uma linha dela. Se trocar o arquivo CSL, as citações e a lista mudam de formato sozinhas.
Não digite entradas à mão. O Google Scholar tem um botão “Citar > BibTeX” em cada resultado, e gerenciadores como o Zotero exportam a biblioteca inteira num .bib e o mantêm atualizado. Copie a entrada, cole no arquivo e use a chave.
1. Crie um .qmd com o título “Meu primeiro relatório”, duas seções de nível 2 (Introdução e Métodos), uma subseção de nível 3 dentro de Métodos e uma lista aninhada com pelo menos três itens. Renderize e confira o sumário.
O sumário mostra Introdução e Métodos como itens de primeiro nível e Coleta de dados aninhado em Métodos. O título do documento vem do YAML, não de um #.
2. Monte uma tabela com quatro sinais vitais (pressão arterial, frequência cardíaca, frequência respiratória e temperatura), com as colunas Sinal, Valor e Unidade; a coluna de valores alinhada à direita e a de unidades centralizada.
| Sinal | Valor | Unidade |
|---|---|---|
| Pressão arterial | 120/80 | mmHg |
| Frequência cardíaca | 72 | bpm |
| Frequência respiratória | 16 | irpm |
| Temperatura axilar | 36,5 | °C |
3. A pressão arterial média (PAM) é estimada por PAM = PAD + (PAS − PAD)/3, em que PAS e PAD são as pressões sistólica e diastólica. Escreva a fórmula em LaTeX na linha e em destaque, usando \frac, e calcule num chunk a PAM de um paciente com 120/80 mmHg.
Na linha: \(\text{PAM} = \text{PAD} + \frac{\text{PAS} - \text{PAD}}{3}\). Em destaque:
\[ \text{PAM} = \text{PAD} + \frac{\text{PAS} - \text{PAD}}{3} \]
A PAM fica em torno de 93 mmHg. O cálculo no chunk é o mesmo da fórmula, com / no lugar de \frac.
4. Escreva um callout warning com o título “Decimal é ponto” e um callout tip colapsado com o título “Resposta”, cada um com uma frase de sua escolha.
O tipo vai na classe (.callout-warning, .callout-tip), o título é o ## da primeira linha, e collapse="true" fecha o bloco por padrão.
5. Adicione ao seu .bib a entrada abaixo, do livro R Markdown: The Definitive Guide, e cite-a de três formas: entre parênteses, narrativa e com página. Renderize e confira a lista de referências no fim do documento.
Com o estilo Vancouver, as três citações recebem o mesmo número, porque são a mesma obra, e a entrada aparece uma única vez na lista. Só a terceira se distingue, pelo localizador de página. Troque o csl por um estilo autor-data para ver as três formas ficarem diferentes.
Um arquivo
.qmdreúne texto em Markdown, código R executável e metadados num único documento reprodutível. O Markdown formata com sinais de pontuação: asteriscos para ênfase, cerquilhas para títulos, hifens para listas, barras verticais para tabelas. Um bloco entre crases com{r}é executado, e o resultado entra no documento; sem as chaves, o código é apenas exibido. Equações usam LaTeX entre cifrões, desenhadas pelo MathJax no navegador. Citações vêm de um arquivo BibTeX:[@chave]no texto, lista formatada no fim.
| Quero | Escrevo |
|---|---|
| itálico, negrito | *texto*, **texto** |
| título de seção | ## Título |
| lista | - item ou 1. item |
| lista de tarefas | - [ ] pendente, - [x] feito |
| link | [texto](https://endereco) |
| imagem | {width=50%} |
| tabela | barras verticais entre as colunas; :--, :-: e --: alinham |
| nota de rodapé | [^1] no texto e [^1]: texto na definição |
| código exibido | ```r … ``` |
| código executado | ```{r} … ``` |
| equação na linha | $x^2$ |
| equação em destaque | $$ x^2 $$ |
| callout | ::: {.callout-tip} … ::: |
| citação em bloco | > texto |
| citação bibliográfica | [@chave] |
| vídeo | {{< video https://youtu.be/... >}} |
A sintaxe apresentada aqui segue a especificação original do Markdown (2) e a documentação do Quarto (3). A ideia do documento reprodutível, com texto e código no mesmo arquivo, vem do R Markdown (4), antecessor do Quarto, e atravessa todo o livro de Wickham, Çetinkaya-Rundel e Grolemund (1), que acompanha esta disciplina.
O Lab 02 apresenta o Mermaid, uma linguagem de diagramas escrita em texto que o Quarto renderiza no documento: um fluxograma de conduta clínica, um cronograma de Gantt para o projeto de pesquisa e uma linha do tempo da história do R.