在 RMarkdown 中使用 knitr 将 kableExtra 表编译为 PDF 时出错

问题描述 投票:0回答:1

根据另一位用户的建议,我创建了一些可共享的数据来重现此问题。请注意,它仅在从 RMarkdown 编译 PDF 时发生。

```
---
title: "Test_data"
output: pdf_document
geometry: "left=.5in,right=.5in,top=.75in,bottom=.75in"
graphics: yes
keep_tex: true
header-includes:
  - \usepackage{titling}
  # - \usepackage{nopageno}
  - \setlength{\droptitle}{15em}
  - \usepackage{caption}
  - \captionsetup{font=Large}

---
\newpage
```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, warning = FALSE, message = FALSE)

library(dplyr)
library(kableExtra)
library(forcats)


dfcol1 <- rownames(mtcars)
dfcol2 <- c("ABC XYZ1 GAMUT",  "ABC XYZ1 O&M", "USU: IMIT Requirement", "OFFICE OF KJHDH RESEARCH (PPP)\r\n\r\nData Analytics Business Intelligence, Data Science Support", "Test DATA Support", "ABCD Classified Requirement (XYZ Connection)", "Customer Experience (AB) Admin Services", "New ABC Contract for Salesforce/TEST11soft Licenses ABC Transfer Region X", "AFLDP (ABC 123! Leadership Dev Program) PM", "AF MyVECTOR", "Talent Marketplace", "ABCDE / VWXYZ", "Online Education & Training Management", "AB 1234567890", "AB Automated Education Mgmt Sys (ABCDEF)", "ABCD Cyberpunk12345 Recompete", "Service Now Enterprise Solutions", "ABC ABCD AB Office of Budget", "ABC Catalyst (ABCD) A&B Requirement", "ABCDE - A1 ABC Projects to A12 for Regional Work (Potential ABCD 1 A23 Facilitation)", "ABCDE Help Desk Recompete (ABCD12345456789 )", "ABCXYZ Facility Related Control Systems  (1234), and Advanced Metering Infrastructure (ABC) System Upgrades", "ABCDE Recompete Package", "Software Development ABC \r\n(Digital ABDERTHKDOUG Phase 2 task order)", "ABC Program office X support (abcdefghtihf)", "Network Management Support (abcdefghjikl)", "Domain X - Bridges", "Domain 3 ABC - B-TEST ABC AB 3 DAY 181 XX", "Domain 4 - Abcde - B-TEST ABC AB 4 DAY 181 XX", "Domain 3 ABC - B-TEST ABC AB 3 DAY 181 XX", "Domain 4 - Abcde - B-TEST ABC AB 4 DAY 181 XX", "Domain 3 ABC - B-TEST ABC AB 3 DAY 181 XX")

dfcolnames <- c("Names", "Problem Column")

df <- as.data.frame(cbind(dfcol1, dfcol2))
colnames(df) <- dfcolnames

df1 <- df%>%
  left_join(mtcars%>%
              mutate(Names = rownames(mtcars),
                     gear = as.character(gear)))%>%
  select("mpg", "Problem Column", "disp", "gear", "Names", "hp", "drat")
```

\renewcommand{\arraystretch}{1.75}
\captionsetup[table]{labelformat=empty, font={bf, Large}}
```{r, echo=FALSE, results='asis'}
print(
  kable(df1, escape = T, align = 'lccccc', longtable = TRUE,
        caption = "Problem Table")%>%
    pack_rows(index = table(fct_inorder(df1$gear)), escape = F, latex_align = 'c')%>%
    pack_rows(index = table(fct_inorder(df1$Names)))%>%#, escape = F, latex_align = 'c')%>%
    kable_styling(latex_options = c("HOLD_position", "repeat_header", "asis"), font_size = 8)%>%
    column_spec(1, bold = F, width_min = ".5in", width = "1in")%>%
    column_spec(2, bold = F, width_min = "1.5in", width = "2.5in")%>%
    column_spec(3, bold = F, width_min = ".5in", width = ".7in")%>%
    column_spec(4:6, bold = F, width_min = "0.35in", width = "0.75in")%>%
    column_spec(7, bold = F, width_min = "0.2in", width = "0.25in")
)
cat("\n")

```
```
```

请注意,现在可以通过将“21.4 & OFFICE OF KJHDH RESEARCH (PPP)”从 tex 文件的第 121 行移动到紧接第 123 行第二个右括号之后以及第 205 行的“13.3 & Software Development ABC”来编译该文档到第 208 行第二个右括号之后。

原帖: 我有一个 RMarkdown 脚本,它was成功编译了 PDF 报告。然后我将其中一列更改为其他列,并引发以下错误:

```
! Misplaced \omit.
\multispan ->\omit 
                   \@multispan 
l.391 \multicolumn{7}{c}{\textbf{<redacted name1>}}
                                                  \\ 
```

在原始代码中,以下代码块是罪魁祸首。注释掉它可以让文档编译。有问题的专栏是第二个。如果我手动更改数据准备块中的该列,则文档将进行编译。当然,这只能在测试中完成,因为我们需要该列中的信息。请注意,出于保密考虑,无法显示准备工作,但

mutate('col2 name' = "AAAAA")
工作正常,但
mutate('col2 name' = if_else(condition, "New Text", 'col2 name'))
尽管存在多种条件和替换,但仍无法正常工作。

```
print(
  kable(df_inproc_COa, escape = T, align = 'lccccc', longtable = TRUE, 
        caption = "Events Beginning within 2 months")%>%
    # header_separate(sep = "[^[:alnum:]]+")%>%
    pack_rows(index = table(fct_inorder(df_inproc_CO$`CO Branch`)), escape = F, latex_align = 'c')%>%
    pack_rows(index = table(fct_inorder(df_inproc_CO$`CO`)))%>%#, escape = F, latex_align = 'c')%>%
    kable_styling(latex_options = c("HOLD_position", "repeat_header", "asis"), font_size = 8)%>%
    column_spec(1, bold = F, width_min = ".5in", width = "1in")%>%
    column_spec(2, bold = F, width_min = "1.5in", width = "2.5in")%>%
    column_spec(3, bold = F, width_min = ".5in", width = ".7in")%>%
    column_spec(4:6, bold = F, width_min = "0.35in", width = "0.75in")%>%
    column_spec(7, bold = F, width_min = "0.2in", width = "0.25in")%>%
    row_spec(which(df_inproc_COa$`Days Left` <=0), bold = T, background = "red")
)
```

我尝试调整列宽但无济于事,因此我通读了 Tex Log 文件并开始使用 RMarkdown 生成的 Tex 文档(keep_tex = TRUE)。其中,我找到了解决办法。改变这个

<readacted id1> & <redacted title part 1>

\multicolumn{7}{c}{\textbf{<redacted name1>}}\\
\hline
\multicolumn{7}{l}{\textbf{<redacted name2>}}\\
\hline
\hspace{1em}\hspace{1em}<redacted title part 2> & 02/23/2024 & 12/14/2022 & 12/13/2022 & 12/14/2022 & 15 days\\

到此

\multicolumn{7}{c}{\textbf{<redacted name1>}}\\
\hline
\multicolumn{7}{l}{\textbf{<redacted name2>}}\\
\hline
\hspace{1em}\hspace{1em}<readacted id1> & <redacted title part 1><redacted title part 2> & 02/23/2024 & 12/14/2022 & 12/13/2022 & 12/14/2022 & 15 days\\

允许编译 Tex 文档。请注意,我只是将

<readacted id1> & <redacted title part 1>
移至
<redacted title part 2>
前面。

我真的很想找到一种方法在 RMarkdown 端解决这个问题,以便文档可以直接编译。是什么导致 tex 代码写得如此错误,我该如何修复它? 请注意,为第二个位置选择不同的列也可以,但我需要包含该信息。预先感谢您,对于缺乏可重现的示例,我再次表示歉意。

latex r-markdown kable kableextra
1个回答
0
投票

示例数据的第 2 列中有控制字符,例如

df1[4,2]
包含此字符串:

## [1] "OFFICE OF KJHDH RESEARCH (PPP)\r\n\r\nData Analytics Business Intelligence, Data Science Support"

去掉那些控制字符,一切就应该可以了。在你的例子中,我可以这样做:

df1[,2] <- gsub("[[:cntrl:]]", "", df1[,2])

此行应位于第一个代码块的末尾。

您的真实数据集可能包含控制字符 其他栏目。

© www.soinside.com 2019 - 2024. All rights reserved.