Reputation: 133
I use flextable()
in Rmarkdown for creating tables. I knit my code to word_document output. Does anyone have an idea how to fit the width of the table not to the content, but to the width of the side borders in the word_document output?
---
title: ""
output: word_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(flextable)
library(dplyr)
```
## R Markdown
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.
When you click the **Knit** button a document will be generated that includes both content as well as the output of any embedded R code chunks within the document. You can embed an R code chunk like this:
```{r cars}
head(cars)%>%
flextable()%>%
theme_box()%>%
autofit()
```
Below I am attaching two pictures:
Thanks!
Upvotes: 4
Views: 3029
Reputation: 133
The solution to fit column widths based on column content and side borders in the word_document output
---
title: ""
output: word_document
---
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = TRUE)
library(flextable)
library(dplyr)
```
## R Markdown
This is an R Markdown document. Markdown is a simple formatting syntax for authoring HTML, PDF, and MS Word documents. For more details on using R Markdown see <http://rmarkdown.rstudio.com>.
```{r cars}
i = 16.5 # width of the side borders in the word_document output (in centimeters)
w = i*0.3937 # width of the side borders in the word_document output (in inches)
df <- data.frame('model' = rownames(mtcars), mtcars[1:5])
t<-flextable(head(df,3))
t #not fitted table, all cols have the same base widths
t<-autofit(t)
t #auto-fitted, cols have the widths based on col content
#get column widths proportions from auto-fitted table
auto_widths <- dim(t)$widths/sum(dim(t)$widths)
# fit col widths based on col content and side borders in the word_document output
t<-width(t, width=w*auto_widths)
t
```
Upvotes: 2
Reputation: 133
Based on the manro solution, I write a code that makes a table with a given width, no matter how many columns there are in the table. It was also my goal, which I may not have clearly explained in my question.
```{r cars}
i = 16.5 # width of the side borders in the word_document output (in centimeters)
w = i*0.3937 # width of the side borders in the word_document output (in inches)
# Table 1 with 2 columns
head(cars,3) %>%
flextable %>%
width(., width = (w/(ncol(cars)))) %>%
theme_box()
# Table 2 with 5 columns
head(iris,3) %>%
flextable %>%
width(., width = (w/(ncol(iris)))) %>%
theme_box()
```
Upvotes: 2