gpt4 book ai didi

r - knitr/rmarkdown/Latex : How to custom justify xtable columns using dcolumn, 同时抑制其他 dcolumn 格式

转载 作者:行者123 更新时间:2023-12-01 00:39:17 28 4
gpt4 key购买 nike

我有一个值表,其中每个单元格都有一个数字、一个空格,然后是括号中的另一个数字。我正在使用 xtable在文档中呈现此表。我希望数字在左括号(或空格)上是合理的。我用过 latex dcolumn package 来创建一个命令来对齐左括号。但是,这改变了表格格式的其他方面,我想防止这种情况发生。

我知道就够了latex很危险,不确定下一步。下面是一个可重现的例子,展示了表格现在的样子,并解释了我实际上喜欢它的样子。我想弄清楚如何在 rmarkdown 中以编程方式获得我想要的格式文档,这样我就不必事后破解 latex 了。另外,我不喜欢这种证明表格值合理的特殊方法,所以如果我走错了路,请随时提出另一种方法。

由于这个问题的重点是在 r 的上下文中使用 latex , knitrrmarkdown ,我认为在这里问会更好,但请告诉我是否应该将其移至 Tex Stack Exchange 站点代替。
header.tex包含 dcolumn 的文件命令:

\usepackage{dcolumn}
\newcolumntype{Q}{D{(}{(}{-1}}
rmarkdown文档:
---
title: "Test"
date: "July 19, 2016"
output:
pdf_document:
includes:
in_header: header.tex
keep_tex: yes
number_sections: yes
fontsize: 11pt
geometry: margin=1in
graphics: yes
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE, message=FALSE, warning=FALSE, fig.align="center")
```

```{r}
library(xtable)

# Data frame to create table
tab1 = structure(list(Term = structure(1:5, .Label = c("Fall 2007",
"Spring 2008", "Fall 2008", "Spring 2009", "Fall 2009", "Spring 2010",
"Fall 2010", "Spring 2011", "Fall 2011", "Spring 2012", "Fall 2012",
"Spring 2013", "Fall 2013", "Spring 2014", "Fall 2014", "Spring 2015",
"Fall 2015", "Spring 2016", "Fall 2016"), class = c("ordered",
"factor")), `BIO 10` = c("89 (2)", "96 (2)", "77 (1)", "103 (3)",
"81 (1)"), `BIO 20` = c("194 (5)", "175 (3)", "176 (8)", "168 (3)",
"170 (4)"), `BIO 30` = c("153 (2)", "154 (14)", "188 (7)", "192 (9)",
"183 (8)"), `BIO 40` = c("284 (23)", "296 (5)", "267 (17)", "296 (16)",
"279 (7)"), `BIO 50` = c("88 (1)", "107 (5)", "98 (1)", "109 (7)",
"93 (5)")), .Names = c("Term", "BIO 10", "BIO 20", "BIO 30",
"BIO 40", "BIO 50"), row.names = c(NA, 5L), class = "data.frame")
```

```{r results="asis"}
print.xtable(
xtable(tab1,
label="tab:tab1",
caption = "Default Table"),
size="small",
include.rownames=FALSE, comment=FALSE, caption.placement="top"
)
```

```{r results="asis"}
print.xtable(
xtable(tab1,
label="tab:tab2",
caption = "Columns aligned at left parenthesis",
align=c("llQQQQQ")),
size="small",
include.rownames=FALSE, comment=FALSE, caption.placement="top"
)
```

以下是 rmarkdown 的输出文档。表 1 是 xtable 创建的默认表.表 2 使用 dcolumn my_header.tex 中的命令文件。在表 2 中,每个单元格中的左侧数字右对齐,这正是我想要的。然而, docolumn以我不想要的其他方式更改了格式:
  • 列标题应类似于表 1 中的列标题,这意味着不应使用斜体,并且 BIO 和以下数字之间应有一个空格。
  • 列宽应该更像表 1 中的宽度。
  • 在数据列中,第一个数字和括号中的数字之间应该有一个空格。例如,
    “89(2)”应该是“89(2)”。
  • 如果可能,最好将两个数字分别右对齐。这意味着数字之间可以有一个或两个空格,具体取决于括号中的数字分别是两位数还是一位数。

  • enter image description here

    最佳答案

    我在这个意义上更新了我的答案,你不需要 dcolumn了。在使用 R 的正则表达式功能和添加原始 LaTeX 命令(例如 {\hskip 0.5em})之间有点混合。 .问题是,您可以在(据我所知)任何 LaTeX 环境中添加这些原语,以便格式化您的段落等。

    所以使用 apply我们重新格式化 内容 表格单元格的数量取决于括号中的数字是 1 位还是 2 位,然后添加适当的水平间距。

    通过使用 sanitize.text.function = identity内部 print.xtable我们确保这些 LaTeX 命令在 data.frame 时不会被删除。由 xtable 处理.

    ---
    title: "Test"
    output:
    pdf_document:
    keep_tex: true
    ---

    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = FALSE, message=FALSE, warning=FALSE, fig.align="center")
    ```

    ```{r}
    library(xtable)
    namesVec <- c("Term", "BIO 10", "BIO 20", "BIO 30",
    "BIO 40", "BIO 50")
    # Data frame to create table
    tab1 = structure(list(Term = structure(1:5, .Label = c("Fall 2007",
    "Spring 2008", "Fall 2008", "Spring 2009", "Fall 2009", "Spring 2010",
    "Fall 2010", "Spring 2011", "Fall 2011", "Spring 2012", "Fall 2012",
    "Spring 2013", "Fall 2013", "Spring 2014", "Fall 2014", "Spring 2015",
    "Fall 2015", "Spring 2016", "Fall 2016"), class = c("ordered",
    "factor")), `BIO 10` = c("89 (2)", "96 (2)", "77 (1)", "103 (3)",
    "81 (1)"), `BIO 20` = c("194 (5)", "175 (3)", "176 (8)", "168 (3)",
    "170 (4)"), `BIO 30` = c("153 (2)", "154 (14)", "188 (7)", "192 (9)",
    "183 (8)"), `BIO 40` = c("284 (23)", "296 (5)", "267 (17)", "296 (16)",
    "279 (7)"), `BIO 50` = c("88 (1)", "107 (5)", "98 (1)", "109 (7)",
    "93 (5)")), .Names = paste("\\textnormal{", namesVec, "}"), row.names = c(NA, 5L), class = "data.frame")

    tab1 <-apply(tab1, 2, function(x) {
    tmp <- nchar(gsub(".*\\( ?([0-9]+).*","\\1", x))
    skip <-ifelse(tmp == 1, "{\\\\hskip 1em}(", "{\\\\hskip 0.5em}(")
    ifelse(tmp == 1, gsub(x, pattern = " \\(", replacement = paste("{\\\\hskip 1em}(")),
    gsub(x, pattern = " \\(", replacement = paste("{\\\\hskip 0.5em}(")))
    })
    ```


    ```{r results="asis"}
    print.xtable(
    xtable(tab1,
    label="tab:tab2",
    caption = "Columns aligned at left parenthesis",
    align=c("llrrrrr")),
    size="small",
    include.rownames=FALSE, comment=FALSE, caption.placement="top"
    , sanitize.text.function = identity)
    ```

    enter image description here

    关于r - knitr/rmarkdown/Latex : How to custom justify xtable columns using dcolumn, 同时抑制其他 dcolumn 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38462519/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com