Criando relatórios do MS Word usando o pacote oficial

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br


Geralmente, o produto final que um cientista de dados ou estatístico gera é um relatório, geralmente no formato MS Word. O pacote oficial permite gerar um relatório desse tipo dentro da R. Ele também permite gerar apresentações do PowerPoint, mas isso está além do escopo desta postagem.

Embora o pacote tenha muitos recursos excelentes, o uso do pacote não é intuitivo. O manual do pacote cobre não menos que 80 páginas. Existem muitas funções que permitem controlar muitos aspectos dos documentos do Word e da apresentação do PowerPoint.

O que eu realmente preciso é executar duas tarefas: inserir tabelas e figuras no meu documento do Word, e também quero aplicar um formato padrão a todos os meus relatórios. Também preciso adicionar títulos, linhas vazias e quebras de página.

Para essas necessidades, escrevi algumas funções que me permitem criar relatórios padronizados de documentos do Word usando uma sintaxe intuitiva.

Além do pacote oficial, o pacote flexível também é necessário:

library(officer)
library(flextable)

A primeira função cria um novo objeto que representa o documento do Word a ser criado. Simplesmente envolve a função read_docx () do oficial, com a ressalva de que, se um objeto com o mesmo nome já existe, ele o substitui por um novo objeto “limpo”:

# create new word document
new.word.doc=function(){
  my.doc=read_docx()
  return(my.doc)
}

As próximas duas funções para adicionar uma linha vazia ou uma quebra de página:

# add an empty line
add.empty.line=function(doc){
  body_add_par(doc, " ")
  return("empty line added")
}

#add page break
add.page.break=function(doc){
  body_add_break(doc, pos="after")
  return("page break added")
}

As próximas duas funções são usadas para definir a orientação da página seguinte para paisagem e depois voltar para retrato:

# start landscape
start.landscape=function(doc){
  doc=body_end_section_continuous(doc)
  return("landscape orientation started")
}

# end landscape
end.landscape=function(doc){
  doc=body_end_section_landscape(doc)
  return("landscape orientation ended")
}

Esta função adiciona um título. Eu uso a função fp_text () para definir o tamanho da fonte para 14 e o tipo de fonte para negrito. Também adiciono uma linha vazia após o título:

# add a title
add.title=function(doc, my.title){
my.prop=fp_text(font.size = 14, bold = TRUE, font.family = "Times")
the.title=fpar(ftext(my.title, prop=my.prop))
body_add_fpar(doc, the.title)
body_add_par(doc, " ")
return("title added")
}

A próxima função é um pouco mais complicada. Ele adiciona ao documento uma figura que já existe como um arquivo de imagem no diretório de trabalho. Os parâmetros hew indicam a altura e a largura da imagem no documento, em polegadas. Meus valores habituais de escolha são h = 5 ew = 5, então eu os defino como padrão. Alinhei a figura ao centro da página.

# add an image, such as a jpg or png file
add.image=function(doc, image, h=5, w=5){
  body_add_img(doc, src=image,
               height=h, width=w,
               style="centered")
  return("image added")
}

A última função, add.table (), é a mais complicada. A tabela a ser adicionada é um quadro de dados, e minha função assume que as variáveis ​​nesse quadro de dados são caracteres, fator ou numérico.

Leia Também  1º Aluguel de Reabilitação. em detalhe

Eu tenho dois parâmetros para definir o número de decimais a serem apresentados para cada uma das variáveis ​​numéricas. O primeiro parâmetro recebe os nomes das variáveis ​​numéricas, o segundo contém o número de casas decimais para cada uma dessas variáveis, respectivamente. Observe que eu não verifico as entradas desses dois parâmetros. Confio em mim mesmo para inserir a entrada correta.

Além disso, a função define o formato da tabela (bordas, fontes e formatação de cabeçalho) de acordo com meu estilo de relatório padrão, usando funções oficiais como border_outer (), bold () etc.

# add a data frame as a table
add.table=function(doc, tbl, col.keys=NULL, col.digits=NULL){
  # create basic flextable
  f.table=qflextable(tbl)

  # set numbers of decimals for numeric variables, if specified
  if(!is.null(col.keys)){
    for(j in 1:length(col.keys)){
      f.table=colformat_num(x=f.table,
                            col_keys=col.keys[j],
                            digits=col.digits[j])
    }
  }
  
  # set table borders
  f.table=border_outer(f.table, part="all",
                       border=fp_border(color="black", width = 1))
  f.table=border_inner_h(f.table, part="all",
                         border=fp_border(color="black", width = 1))
  f.table=border_inner_v(f.table, part="all",
                         border=fp_border(color="black", width = 1))
  
  # set fonts
  f.table=font(f.table,  fontname = "Times", part = "all")
  # also set the table's header font as bold
  f.table=bold(f.table, part = "header")
  
  # add the table to the document
  flextable::body_add_flextable(doc, 
                                value = f.table, 
                                align = "left" )
  return("table added")
}

Agora estamos prontos para criar o relatório:

cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br
# create an histogram and save it as a png file:
png(filename="histogram.png", width = 6, height = 6, units = 'in', res = 300)
hist(mtcars$wt)
dev.off()

# create a data frame that will become a table in my report
wide.table=mtcars[1:6, ]
wide.table$car=rownames(wide.table)
wide.table=wide.table[, c(12, 1:11)]
narrow.table=wide.table[, 1:4]

# create a new document object
doc=new.word.doc()

# add the report title and an empty line
add.title(doc, "My report")
add.empty.line(doc)

add.title(doc, "narrow table")
add.table(doc, narrow.table, col.keys=c("mpg", "disp"), col.digits=c(1,0))

add.page.break(doc)

# add the histogram with an apropriate title
add.title(doc, "Histogram - portrait")
add.image(doc, "histogram.png", h=3, w=3)

# set the orientation to lndscape
start.landscape(doc)

add.title(doc, "narrow table - landscape")
add.table(doc, narrow.table, col.keys=c("mpg", "disp"), col.digits=c(1,0))

add.empty.line(doc)

# add the wide table in landsacape page orientation
add.title(doc, "wide table in landscape orientation")
add.table(doc, wide.table, col.keys=c("mpg", "disp"), col.digits=c(1,0))

#set the orientation back to portrait
end.landscape(doc)

add.title(doc, "narrow table")
add.table(doc, narrow.table, col.keys=c("mpg", "disp"), col.digits=c(1,0))

# generate the Word document using the print function
print(doc, target="My report.docx")

Como não consigo enviar um documento do Word para o WordPress, aqui está uma impressão em tela do relatório:

Leia Também  Forte desenvolvimento de negócios no quarto trimestre de 2019



Se você chegou até aqui, por que não inscreva-se para atualizações do site? Escolha seu sabor: e-mail, Twitter, RSS ou facebook …



cupom com desconto - o melhor site de cupom de desconto cupomcomdesconto.com.br