Kableextra: после обновления до R 4.0.3 и переустановки я не могу правильно запустить старый скрипт с многострочным переносом текста в каждой ячейке

Дорогой,

Это похоже на один скрипт, который я запускал в течение нескольких месяцев на своей платформе.

У меня есть длинный текст внутри столбца (называемый описанием), и я хочу его обернуть (не более 20 символов в строке). Для этого у меня есть функция, которая вставляет в текст разрывную строку \n всякий раз, когда это необходимо. Затем я использую функцию переноса строки kableextra для этого текста, чтобы убедиться, что перевод строки правильно понят (и это так).

Затем окончательный результат обрабатывается с помощью латекса для создания PDF-файла. Беда в том, что текст внутри столбца описания хоть и разбит, как я хочу, но больше не выровнен по левому краю. Я уверен, что раньше у меня такого не было (до обновления R до 4.0.3 и переустановки kableextra).

Всем, кто знает, как это исправить, моя благодарность!

Спасибо

library(tidyverse)
library(kableExtra)
#> 
#> Attaching package: 'kableExtra'
#> The following object is masked from 'package:dplyr':
#> 
#>     group_rows
library(formattable)




##Functions to wrap and format text in the table



wrapper2 <- function(x, width) {
    lapply(strwrap(x, width = width, simplify = FALSE), paste, collapse="\n")
    
}


wrapper_text <- function(x, width) {
 res <- wrapper2(x, width) %>% unlist
    return(res)
}







df <- structure(list(description = c("Total Goods", "85 Electrical machinery and equipment", 
"84 Machinery and mechanical appliances", "63 Other made-up textile articles", 
"94 Furniture; lamps and lighting fittings", "90 Optical, medical or surgical instruments", 
"62 Apparel and clothing, not knitted or crocheted", "29 Organic chemicals", 
"39 Plastics", "95 Toys, games and sports requisites", "87 Motor vehicles"
), y = c(8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8)), row.names = c(NA, 
-11L), class = c("tbl_df", "tbl", "data.frame"))

df2 <-  df  %>%
    mutate(description=wrapper_text(description, 20))  %>%
    mutate(description=linebreak(description))


mytable <- df2 %>%
     kable("latex", booktabs = T, escape = F,align=c("l", "r")) %>%
 
    kable_styling( ) 




writeLines(
  c(

      "\\documentclass{article}",
      "\\usepackage{graphicx}",
      "\\usepackage{makecell}",
"\\usepackage{float}",
          "\\usepackage{booktabs}",
"\\begin{document}",
"\\pagestyle{empty}",
    mytable,
    "\\end{document}"
  ),
  "test_table.tex"
)





tools::texi2pdf("test_table.tex", clean = TRUE)


print(sessionInfo())
#> R version 4.0.3 (2020-10-10)
#> Platform: x86_64-pc-linux-gnu (64-bit)
#> Running under: Debian GNU/Linux 10 (buster)
#> 
#> Matrix products: default
#> BLAS:   /usr/lib/x86_64-linux-gnu/openblas/libblas.so.3
#> LAPACK: /usr/lib/x86_64-linux-gnu/libopenblasp-r0.3.5.so
#> 
#> locale:
#>  [1] LC_CTYPE=en_GB.UTF-8       LC_NUMERIC=C              
#>  [3] LC_TIME=en_GB.UTF-8        LC_COLLATE=en_GB.UTF-8    
#>  [5] LC_MONETARY=en_GB.UTF-8    LC_MESSAGES=en_GB.UTF-8   
#>  [7] LC_PAPER=en_GB.UTF-8       LC_NAME=C                 
#>  [9] LC_ADDRESS=C               LC_TELEPHONE=C            
#> [11] LC_MEASUREMENT=en_GB.UTF-8 LC_IDENTIFICATION=C       
#> 
#> attached base packages:
#> [1] stats     graphics  grDevices utils     datasets  methods   base     
#> 
#> other attached packages:
#>  [1] formattable_0.2.0.1 kableExtra_1.2.1    forcats_0.5.0      
#>  [4] stringr_1.4.0       dplyr_1.0.2         purrr_0.3.4        
#>  [7] readr_1.4.0         tidyr_1.1.2         tibble_3.0.3       
#> [10] ggplot2_3.3.2       tidyverse_1.3.0    
#> 
#> loaded via a namespace (and not attached):
#>  [1] styler_1.3.2      tidyselect_1.1.0  xfun_0.18         haven_2.3.1      
#>  [5] colorspace_1.4-1  vctrs_0.3.4       generics_0.0.2    viridisLite_0.3.0
#>  [9] htmltools_0.5.0   yaml_2.2.1        blob_1.2.1        rlang_0.4.8      
#> [13] pillar_1.4.6      glue_1.4.2        withr_2.3.0       DBI_1.1.0        
#> [17] dbplyr_1.4.4      modelr_0.1.8      readxl_1.3.1      lifecycle_0.2.0  
#> [21] munsell_0.5.0     gtable_0.3.0      cellranger_1.1.0  rvest_0.3.6      
#> [25] htmlwidgets_1.5.2 evaluate_0.14     knitr_1.30        fansi_0.4.1      
#> [29] highr_0.8         broom_0.7.1       Rcpp_1.0.5        scales_1.1.1     
#> [33] backports_1.1.10  webshot_0.5.2     jsonlite_1.7.1    fs_1.5.0         
#> [37] hms_0.5.3         digest_0.6.25     stringi_1.5.3     grid_4.0.3       
#> [41] cli_2.0.2         tools_4.0.3       magrittr_1.5      crayon_1.3.4     
#> [45] pkgconfig_2.0.3   ellipsis_0.3.1    xml2_1.3.2        reprex_0.3.0.9001
#> [49] lubridate_1.7.9   assertthat_0.2.1  rmarkdown_2.4     httr_1.4.2       
#> [53] rstudioapi_0.11   R6_2.4.1          compiler_4.0.3

Создано 13 октября 2020 г. с помощью пакета reprex (v0.3.0.9001)


person larry77    schedule 13.10.2020    source источник
comment
Я вижу, что вы одновременно открыли вопрос на гитхабе kableExtra. Не могли бы вы сказать нам конкретно, что означает «сломанный»? Не могли бы вы упростить пример? Попробуйте удалять команды одну за другой, пока проблема не исчезнет. Это скажет вам, какая из команд, в частности, вызывает проблему. Имея этот минимально воспроизводимый пример, мы можем помочь вы найдете проблему. Кроме того, это может зависеть от остальной части вашего документа LaTeX. Так что предоставьте действительно минимальный пример этого тоже.   -  person Vincent    schedule 13.10.2020
comment
Я упростил и уточнил пост. Если бы я знал, как сделать так, чтобы проблема исчезла, удалив строчку за строчкой, я бы сейчас не выкладывал. Тем не менее, замечание по поводу более компактного поста.   -  person larry77    schedule 13.10.2020


Ответы (1)


Проблема, похоже, связана с вашими функциями-оболочками, а не с kableExtra. Если вы проверите свой df2 data.frame, вы увидите, что он содержит много вызовов \makecell со странным выравниванием.

Эти makecells вставляются функцией kableExtra::linebreak. Чтобы получить желаемое поведение, измените функцию-оболочку следующим образом:

linebreak(description, align='l')

This change of behavior was introduced in a recent commit to the kableExtra repository .

Для справки, я думаю, что более идиоматичным (и более простым) способом использования kableExtra в этом контексте было бы избегать переноса текста самостоятельно и указывать ширину столбца с помощью функции column_spec.

Обратите внимание, что я специально использую кадр df, а не просматриваю df2, как вы:

library(kableExtra)

mytable <- df %>% 
  kbl("latex", booktabs=TRUE, escape=FALSE, align="lr") %>%
  kable_styling() %>%
  column_spec(1, width="2in")

writeLines(c(
  "\\documentclass{article}",
  "\\usepackage{graphicx}",
  "\\usepackage{makecell}",
  "\\usepackage{float}",
  "\\usepackage{booktabs}",
  "\\begin{document}",
  "\\pagestyle{empty}",
  mytable,
  "\\end{document}"),
  "test_table.tex"
)
tools::texi2pdf("test_table.tex", clean = TRUE)

Это создает документ с этой таблицей:

введите здесь описание изображения

person Vincent    schedule 13.10.2020
comment
Я полагаю, что скоро приму это как ответ - спасибо. Меня все еще озадачивает то, что я мог использовать свою обертку в течение нескольких месяцев без сбоев. - person larry77; 14.10.2020
comment
Ха! Я думаю, что я нашел что-то! Попробуйте это в последней строке вашей функции wrapper2: linebreak(description, align="l"). Looks like there was a change to the align parameter a few months ago: github.com /haozhu233/kableExtra/коммит/ - person Vincent; 14.10.2020
comment
ХОРОШО! Это действительно тот ответ, который я искал, и причина, по которой код не работал, как раньше. Новый дефолт кажется мне безумием, но, по крайней мере, я знаю, что произошло. Я отмечу ваше предыдущее предложение как ответ, но на самом деле это ваш комментарий сделал это для меня. Спасибо. - person larry77; 14.10.2020
comment
круто, я отредактировал свой ответ, включив в него обсуждение linebreak. - person Vincent; 14.10.2020