Rmarkdown: automatizar subtítulos e textos

Olá pessoal,

Criei uma lista da minha base de dados(painel) para analisar cada cliente individualmente conforme código abaixo:

title: "Untitled"
author: "Saulo"
date: "02/01/2021"
output:
  html_document:
    toc: yes
    toc_float: yes
    theme: united

library(tidyverse)

painel <- tibble(codigo = rep(1:10),
                 nome = c("Joao", "Pedro", "Gabriel", "Aline", "Ruan", 
                          "Ana Clara", "Thiago", "Jessica", "Adriana", "Robson"),
                 idade = c(18, 25, 33, 50, 27, 48, 21, 60, 36, 75),
                 profissao_risco = c("NAO", "SIM", "SIM", "NAO","NAO",
                                     "SIM", "SIM", "NAO","NAO","NAO"),
                 churn= c(0, 0, 1, 0, 0, 1, 1, 0, 0, 0),
                 insid= c(0, 0, 1, 0, 0, 1, 1, 1, 0, 1),
                 att_cad= c(0, 0, 1, 1, 0, 0, 0, 1, 1, 0),
                 proc= c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 mudan= c(1, 0, 0, 1, 1, 0, 0, 0, 1, 0),
                 med_bvsp= c(1, 1, 1, 0, 1, 0, 1, 1, 0, 1),
                 med_bmf= c(1, 1, 0, 1, 0, 0, 0, 1, 0, 1),
                 transf= c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 pat_cust= c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
                 pat_nett= c(1, 0, 0, 1, 0, 1, 0, 1, 0, 0),
                 pat_transf= c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
                 pat_mov= c(1, 0, 0, 0, 1, 1, 0, 1, 0, 1),
                 dt_bvsp= c(1, 1, 1, 1, 1, 1, 1, 1, 1, 1)
                 ) %>% mutate(codigo = as.character(codigo))

### Análise individual dos clientes

## Analisando cada cliente individualmente:
lista_cliente = list()

for (i in 1:length(painel$codigo)) {
  #i=1
  lista_cliente[i] <- list(painel[i,])
  
  # Atribuindo nome a lista
  names(lista_cliente)[i] <- list(paste0("cliente", rownames(painel)[i]))
  
  # filtra só as modalidades que o cliente foi alertado: 
  lista_cliente[[i]] %>%
     pivot_longer(
                  cols = c(5:17),
                  names_to = "alertas",
                  values_to = "caiu",
                  values_drop_na = TRUE
                  ) %>%
  filter(caiu == 1) %>%
  spread(alertas, caiu) -> lista_cliente[[i]]
}

### cliente - 1
O cliente r lista_cliente[[1]][2] caiu nos alertas:
r paste0(colnames(lista_cliente[[1]][5:ncol(lista_cliente[[1]])]))

### cliente - 2
O cliente … caiu nos alertas: …

### cliente - (i)
O cliente … caiu nos alertas: …

chegando a este resultado:

No entanto, estou tentando automatizar os “subtítulos e textos” para cada cliente da lista com a função cat() e paste0() conforme código abaixo, mas não estou conseguindo:

## Analisando cada cliente individualmente:
lista_cliente = list()

for (i in 1:length(painel$codigo)) {
  #i=1
  lista_cliente[i] <- list(painel[i,])
  
  # Atribuindo nome a lista
  names(lista_cliente)[i] <- list(paste0("cliente", rownames(painel)[i]))
  
  # filtra só as modalidades que o cliente foi alertado: 
  lista_cliente[[i]] %>%
     pivot_longer(
                  cols = c(5:17),
                  names_to = "alertas",
                  values_to = "caiu",
                  values_drop_na = TRUE
                  ) %>%
  filter(caiu == 1) %>%
  spread(alertas, caiu) -> lista_cliente[[i]]
  
  cat("###", "cliente - ", lista_cliente[[i]], 
      paste0("O cliente ", lista_cliente[[i]][2], " caiu nos alertas: ", 
                 colnames(lista_cliente[[i]][5:ncol(lista_cliente[[i]])])), "\n")
}

Erro: ### cliente - Error in cat("###", "cliente - ", lista_cliente[[i]], paste0("O cliente ", :
argumento 3 (tipo ‘list’) não suportado por ‘cat’

Oi, Saulo

Você o segredo está em usar o argumento results = 'asis' no chunk. Isso faz com que o chunk coloque no Rmd exatamente a saída do print().

Além disso, para facilitar, você também pode usar as funções h1(), h2(), … do pacote {htmltools}, já que elas são equivalentes a colocar os hashtags #, ##, … . E o mais incrível é que também funciona com pdf.

---
title: "Títulos automáticos"
output:
  pdf_document: default
  html_document: default
---

```{r, results='asis', echo = FALSE}
for(i in 1:5) {
  print(htmltools::h2(paste("Título ", i)))
  print(htmltools::h3(paste("Subtítulo ", i)))
}

Uma dica para a sua pergunta: tente sempre enviar um exemplo minimal, com apenas o necessário para demonstrar a sua dúvida. Isso facilita para quem for te ajudar e até a sua dúvida ser respondida mais rápido.

Um abraço!

William, essa sacada do htmltols::h2 foi top demais, muito obrigado pela ajuda!

1 Curtida