Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

PDF - repeated headers overlap the content of merged cell #654

Open
pedrohbraga opened this issue Aug 26, 2024 · 3 comments
Open

PDF - repeated headers overlap the content of merged cell #654

pedrohbraga opened this issue Aug 26, 2024 · 3 comments
Labels

Comments

@pedrohbraga
Copy link

I have been trying to use fit_to_width() to produce tables with Quarto that fit a specific width within the page of the PDF. Unfortunately, autofit() has not helped, and fit_to_width() has not worked as intended. Whenever I use it, it replaces the table content with some placeholder text.

Please find the code and the issue below:

mpd.CFI.CHet.bS.gam.model_summaries <- structure(list(Scale = c("Global", "Global", "Global", "Global", 
"Global", "Global", "Global", "Global", "Hemispheric", "Hemispheric", 
"Hemispheric", "Hemispheric", "Hemispheric", "Hemispheric", "Hemispheric", 
"Hemispheric", "Realm", "Realm", "Realm", "Realm", "Realm", "Realm", 
"Realm", "Realm", "Biome", "Biome", "Biome", "Biome", "Biome", 
"Biome", "Biome", "Biome"), Taxon = c("Amphibians", "Amphibians", 
"Birds", "Birds", "Mammals", "Mammals", "Squamates", "Squamates", 
"Amphibians", "Amphibians", "Birds", "Birds", "Mammals", "Mammals", 
"Squamates", "Squamates", "Amphibians", "Amphibians", "Birds", 
"Birds", "Mammals", "Mammals", "Squamates", "Squamates", "Amphibians", 
"Amphibians", "Birds", "Birds", "Mammals", "Mammals", "Squamates", 
"Squamates"), Response = c("MPD", "MPD", "MPD", "MPD", "MPD", 
"MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", 
"MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", 
"MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD", "MPD"
), Predictors = c("s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)", 
"s(Clim. Freq.) + s(Clim. Het.)", "s(Clim. Freq.) + s(Clim. Het.)"
), Smooth.basis = c("Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines", 
"Thin-plate splines", "Thin-plate splines", "Thin-plate splines"
), Adj..R.2 = c(0.175, 0.175, 0.077, 0.077, 0.053, 0.053, 0.295, 
0.295, 0.098, 0.098, 0.079, 0.079, 0.045, 0.045, 0.154, 0.154, 
0.037, 0.037, 0.076, 0.076, 0.065, 0.065, 0.148, 0.148, 0.132, 
0.132, 0.074, 0.074, 0.016, 0.016, 0.089, 0.089), dev.uniq.non.linear = c(0.039, 
0.039, 0.038, 0.038, 0.007, 0.007, 0.017, 0.017, 0.026, 0.026, 
0.031, 0.031, 0.007, 0.007, 0.036, 0.036, 0.025, 0.025, 0.018, 
0.018, 0.017, 0.017, 0.035, 0.035, 0.027, 0.027, 0.008, 0.008, 
0.015, 0.015, 0.031, 0.031), Predictor = c("s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)", "s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)", "s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)", "s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)", "s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)", "s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)", "s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)", "s(CFI.bS)", "s(heterogeneity.meanEuclid)", 
"s(CFI.bS)", "s(heterogeneity.meanEuclid)"), edf = c(8.94725336461062, 
8.24474929940239, 8.94402808538318, 8.0433126490782, 8.5972718307536, 
6.90985590548356, 8.96129511999248, 8.5986067320282, 8.96563886692967, 
8.30961147988176, 8.98433079686555, 8.23076432847517, 8.90263880010934, 
6.86404424849931, 8.97398220224686, 8.69075105939943, 8.95949377680743, 
8.43700193247956, 8.97097220465126, 8.17551845665404, 8.94535035010068, 
6.58312089445243, 8.97836907118496, 8.72640907751301, 8.8820397256442, 
8.38989735222463, 8.92777933838305, 8.17965037889696, 8.44882219612362, 
6.67862792516023, 8.94350263716568, 8.72142016558614), Ref.df = c(8.99918106400064, 
8.84762420890626, 8.99907385783694, 8.76437213410865, 8.95428497695193, 
8.02973917476159, 8.99955633527575, 8.95532361379465, 8.99964476828757, 
8.87176481676359, 8.9999260146117, 8.84376427000312, 8.9971782037767, 
7.99158455565594, 8.99979564755562, 8.97315094545215, 8.99951059845159, 
8.91317490928138, 8.99974645533773, 8.82184062675737, 8.9991041994842, 
7.7535736056498, 8.99985929333262, 8.97888578568561, 8.99581098178945, 
8.89871654216935, 8.99841268199284, 8.8235135826169, 8.91354725246866, 
7.8363113129187, 8.99902711654054, 8.97812146878775), F = c(4036.31513633459, 
69.7911843367783, 1759.88065677894, 262.705849512569, 1443.42921525763, 
194.454421113521, 8955.41928264452, 92.0348721761402, 2002.68924477316, 
74.588383290832, 1780.02960506767, 322.540064864731, 1165.52780160569, 
200.429583280523, 3622.23334399431, 223.319132967035, 622.826313416701, 
123.844805888992, 1695.43875878549, 301.77693780504, 1757.59584121885, 
203.782496099787, 3445.81563957982, 222.04847289181, 2850.33857052798, 
108.262471571175, 1616.33541454028, 449.583131620976, 343.437567443098, 
98.3637516856449, 1751.09643636829, 340.923735307398), p.value = c(0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), class = "data.frame", row.names = c(NA, 
-32L))
#| label: tbl-mpd-cfi-clim-het-allscales
#| tbl-cap: "**Parameter estimates and model summaries from thin-plate regression smooth splines for the effects of climatic frequency and climatic heterogeneity on mean phylogenetic distances of tetrapod communities.** Climatic frequency was measured across four geographical scales: global, east-west hemisphere, biogeographical realm, and biome extents. Mean phylogenetic distances denote how closely-related co-occurring taxa are in a given community, and was estimate for each tetrapod group separately, being them: amphibians, birds, mammals, and squamate reptiles. Effective estimated degrees of freedom (edf) are taken as number of data minus model degrees of freedom (see Methods)."
#| echo: false
#| message: false
#| warning: false

mpd.CFI.CHet.bS.gam.model_summaries %>%
  mutate(p.value = ifelse(p.value <= 0.0001, 0.001, 0)) %>%
  group_by(Scale, Taxon, Predictor) %>%
  mutate("signif" = NA) %>%
  dplyr::select(
    -c("Response", 
       "Predictors",
       "Smooth.basis")
  ) %>%
  flextable() %>%
  merge_v(1:4) %>%
  valign(valign = 'top') %>%
  add_header_row(values = "Thin-plate regression splines with formula: \nMPD ~ s(Clim. Freq.) + s(Clim. Het.)",
                 colwidths = 10,
                 top = T) %>%
  bold(~ `p.value` <= 0.001, "p.value") %>%
  theme_vanilla() %>%
  mk_par(j = "signif", value = as_paragraph(pvalue_format(p.value)) ) %>% 
  colformat_double(j = c("edf",
                         "Ref.df",
                         "F" ,
                         "dev.uniq.non.linear"), digits = 3) %>%
  set_header_labels(Scale = "Geographical Scale",
                    Adj..R.2 = "Total Adj. R2", 
                    dev.uniq.non.linear = "Non-linear Adj. R2",
                    edf = "edf",
                    Ref.df = "df",
                    p.value = "p-value",
                    signif = "") %>%
  align(j = "signif", align = "left") %>% 
  padding(padding.right = 0, j = "p.value", part  = "all") %>% 
  bold(j = "signif", bold = TRUE) %>% 
  # padding(padding.left = 0, j = "signif", part  = "all") %>% 
  # set_table_properties(width = 1, layout = "autofit") %>%  
  add_footer_lines(values = c(
    "Signif. codes: 0 <= '***' < 0.001 < '**' < 0.01 < '*' < 0.05 < '.' < 0.1 < '' < 1" ))  %>%
  # flextable::fontsize(size = 9, part = "all") %>%
  font(fontname = "Times New Roman", part = "all")  %>%
  autofit() %>%
  fit_to_width(max_width = 7)

Outcome:

image

> sessionInfo()
R version 4.3.3 RC (2024-02-22 r85999 ucrt)
Platform: x86_64-w64-mingw32/x64 (64-bit)
Running under: Windows 11 x64 (build 26120)

Matrix products: default


locale:
[1] LC_COLLATE=English_Canada.utf8  LC_CTYPE=English_Canada.utf8    LC_MONETARY=English_Canada.utf8
[4] LC_NUMERIC=C                    LC_TIME=English_Canada.utf8    

time zone: America/Toronto
tzcode source: internal

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base     

other attached packages:
[1] gt_0.11.0.9000      kableExtra_1.4.0    flextable_0.9.7.008 stringr_1.5.1      
[5] dplyr_1.1.4         tidyr_1.3.1         data.table_1.15.4  

loaded via a namespace (and not attached):
 [1] xfun_0.45               remotes_2.5.0           htmlwidgets_1.6.4       devtools_2.4.5         
 [5] processx_3.8.4          callr_3.7.6             ps_1.7.7                vctrs_0.6.5            
 [9] tools_4.3.3             generics_0.1.3          curl_5.2.1              parallel_4.3.3         
[13] tibble_3.2.1            fansi_1.0.6             pkgconfig_2.0.3         desc_1.4.3             
[17] RcppParallel_5.1.7      uuid_1.2-0              lifecycle_1.0.4         compiler_4.3.3         
[21] textshaping_0.4.0       munsell_0.5.1           httpuv_1.6.15           fontquiver_0.2.1       
[25] fontLiberation_0.1.0    sass_0.4.9              usethis_2.2.3           htmltools_0.5.8.1      
[29] urlchecker_1.0.1        later_1.3.2             pillar_1.9.0            crayon_1.5.3           
[33] gfonts_0.2.0            ellipsis_0.3.2          openssl_2.2.0           rsconnect_1.3.1        
[37] cachem_1.1.0            sessioninfo_1.2.2       mime_0.12               fontBitstreamVera_0.1.1
[41] commonmark_1.9.1        tidyselect_1.2.1        zip_2.3.1               digest_0.6.36          
[45] stringi_1.8.4           purrr_1.0.2             fastmap_1.2.0           grid_4.3.3             
[49] colorspace_2.1-0        cli_3.6.1               magrittr_2.0.3          Rfast_2.1.0            
[53] crul_1.4.2              pkgbuild_1.4.4          utf8_1.2.4              withr_3.0.0            
[57] scales_1.3.0            gdtools_0.3.7           promises_1.3.0          RcppZiggurat_0.1.6     
[61] rmarkdown_2.27          officer_0.6.6           askpass_1.2.0           ragg_1.3.2             
[65] memoise_2.0.1           shiny_1.8.1.1           evaluate_0.24.0         knitr_1.47             
[69] viridisLite_0.4.2       miniUI_0.1.1.1          markdown_1.13           profvis_0.3.8          
[73] rlang_1.1.4             Rcpp_1.0.12             xtable_1.8-4            glue_1.7.0             
[77] httpcode_0.3.0          xml2_1.3.6              pkgload_1.4.0           svglite_2.1.3          
[81] rstudioapi_0.16.0       jsonlite_1.8.8          R6_2.5.1                systemfonts_1.1.0      
[85] fs_1.6.4   
@pedrohbraga pedrohbraga changed the title fit_to_width() is not working properly within Quarto and its PDF outcomes fit_to_width() replaces content with ---- within Quarto and its PDF outcomes Aug 26, 2024
@davidgohel

This comment was marked as outdated.

@pedrohbraga
Copy link
Author

Thank you for your response, @davidgohel! I understand your recommendation and will implement it!

I have an additional issue that I have been experiencing and observed in your output as well. The repeating header appears to overlap the content of tables split across pages, as in the example you pasted above. Would you have a recommendation on what I could do to fix this issue?

@pedrohbraga
Copy link
Author

Here are a few examples of it happening. Note that it also messes up with the cases that are merged (using merge_v()).

image

Here, for instance, what should be "Global" in the first row, has disappeared, probably due to this issue.

image

This can be reproduced with the same code you sent me, but please let me know if you would like some logs or specific files.

@github-staff github-staff deleted a comment from mayank785 Oct 23, 2024
@davidgohel davidgohel changed the title fit_to_width() replaces content with ---- within Quarto and its PDF outcomes PDF - repeated headers overlap the content of merged cell Nov 2, 2024
@davidgohel davidgohel added the bug label Nov 2, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

8 participants
@davidgohel @pedrohbraga and others