4

假设我有以下rmd:

---
title: "Table won't work"
author: "Exhausted student"
date: "2022/01/28"
output: 
  bookdown::word_document2
---

```{r table, echo=F, warning=F, message=F}
library(tidyverse)
a <- tibble(
  constants = c("c", "NA", "h", "e", "H2O"),
  values = c(2.998e8, 6.022e23, 6.626e-34, -1.602e-19, 18.02)
)

knitr::kable(a, digits = 35)
```

在 Word中生成此表。

问题

我需要科学格式来使用上标和乘号(即 2.998 × 10 8),有些单元格需要下标(例如 N A和 H 2 O)。

决赛桌应该是这样的。我怎样才能做到这一点?

我尝试过/永远不会尝试的

  1. huxtable包及其markdown()功能:我设法将一些内容格式化为H~2~O,然后启用跨表降价huxtable(a) %>% `markdown<-`(TRUE)根据作者的说法,它不识别语法,显然在可预见的将来不会起作用。
  2. flextableas_sub():产生正确的格式。我将标签传递给flextable::compose(),标签类似于as_paragraph(list_values = list("H", as_sub("2"), "O")。代码显然太长了;另外我必须一个接一个地操作单元格。从技术上讲仍然可行,但我确实有需要格式化的包含 100 多个单元格的表格。
  3. 首先输出,然后在 Word 中格式化:同样,需要逐个操作。如果它能自动解决所有问题,那将是一个选择。
  4. 说服学校官员接受html/pdf/latex 作为输出:这永远是一个不可能的选择。
  5. 格式化外部单词,然后将格式化的表格导出为图像:报告中严格禁止。

编辑:桌子现在可以工作了!非常感谢Maël 的回答,但请检查我自己的发现以查看我的最终结果:

格式良好的表格

4

4 回答 4

2

您可以使用波浪号 ( ~) 输入下标,插入符号 ( ^) 表示上标;并用于sprintf获取预期的数字格式:

---
title: "Table won't work"
author: "Exhausted student"
date: "2022/01/28"
output: 
  bookdown::word_document2
---

```{r table, echo=F, warning=F, message=F}
library(tidyverse)

expSup <- function(x, digits=3) {
  sprintf(paste0("%05.", digits, "f x 10^%d^"), x/10^floor(log10(abs(x))), floor(log10(abs(x))))
}

a <- tibble(
  constants = c("c", "N~A~", "h", "e", "H~2~0"),
  values = expSup(c(2.998e8, 6.022e-23, 6.626e-34, -1.602e-19, 18.02))
)

knitr::kable(a)
```

在此处输入图像描述

于 2022-01-28T09:36:30.500 回答
1

一个可能属于此开放问题的禁区的选项:

  1. 创建一个html文档,
  2. 为下标插入html标签,
  3. 打开 html 文件(不是查看器),
  4. ctrl+c,然后在你的word文件中按ctrl+v。
---
output: html_document
---

```{r table, echo=F, warning=F, message=F}
library(tidyverse)
library(gt)
a <- tibble(
    constants = c("c", "N<sub>A</sub>", "h","e","H<sub>2</sub>O"),
    values = c(2.998e8, 6.022e23, 6.626e-34, -1.602e-19, 18.02)
)
a %>%
  mutate(constants = map(constants, html)) %>%
  gt() %>%
  fmt_scientific(values)
于 2022-01-28T09:52:44.710 回答
0

Maël 的答案中的expSup()函数将科学格式转换为降价格式。对于我的脚本,我稍微修改了函数:

exp_sup <- function(x, digits = 3) {
  sprintf(paste0("%05.", digits, "f $\\times$ 10^%d^"), x / 10^floor(log10(abs(x))), floor(log10(abs(x))))
}

我更改"f x 10^%d^""f $\\times$ 10^%d^",以便它显示正确的乘法符号 (×)。

使用格式flextable

该格式在Kable. 但是,我的大部分工作流程都需要flextable制作标题/交叉引用/发布样式/等。不幸的是,尽管该expSup函数会自动将科学记数法格式化为 markdown,但它不能使 markdown 语法在 flextable 中工作。

不过,ftExtra::colformat_md()可以。因此,通过将修改后的exp_sup()函数与结合起来ftExtra,我终于能够生成一个学术外观的表格:

最终格式化结果

下面是我最终输出的代码;如果您还尝试使用大量 Word 格式的表格生成可重复的学术报告,希望这会有所帮助!

---
title: "The tables work!"
author: "Satisfied Student"
date: "2022/01/28"
output: 
  bookdown::word_document2:
    reference_docx: styleRef.docx
---
```{r setup, include = F}
library(easypackages)
packages(
  "tidyverse",
  "flextable", # This works best for my workflow
  "ftExtra", # For markdown formatting work in flextable
  "officer" # You can customize appearance/format/etc. of caption *prefixes*
)

knitr::opts_chunk$set(
  warning = FALSE,
  message = FALSE,
  echo = FALSE,

  # Make the table caption format definable in reference_docx styles
  tab.cap.style = "Table Caption",

  # Make "Table 1:" prefixes not bold
  tab.cap.fp_text = fp_text_lite(bold = FALSE)

  # The tab.cap settings MUST be in a separate chunk from tables
)

# Converts scientific format to markdown
exp_sup <- function(x, digits = 3) {
  sprintf(paste0("%05.", digits, "f $\\times$ 10^%d^"), x / 10^floor(log10(abs(x))), floor(log10(abs(x))))
}
# The $\\times$ makes proper multiply symbols
```

```{r table}
a <- tibble(
  constants = c("c", "N~A~", "h", "e", "H~2~O"),
  values = c(2.998e8, 6.022e23, 6.626e-34, -1.602e-19, 18.02)
)

a %>%
  mutate(values = exp_sup(values)) %>%
  flextable() %>%
  set_caption(
    caption = "(ref:foo)", # Produces formatted caption text
    style = "Table Caption"
  ) %>%
  colformat_md() %>% # Subscript/superscript works in flextable now!
  theme_booktabs() %>% # The 3-part-table used in academics
  align(align = "center", part = "all") %>% #Align everything to center
  set_table_properties(layout = "autofit") # Comfortable width/height every cell
```

(ref:foo) A scientifically formatted `flextable` with ^superscripts^ and ~subscripts~
于 2022-01-28T12:46:43.403 回答
-1

您的代码应如下所示:

```
{r table, echo=F, warning=F, message=F}
library(tidyverse)
a <- tibble(
  constants = c("c", "NA", "h", "e", "$H_2O$"),
  values = c("$2.998 * {10^{8}}$", "$6.022 * {10^{-23}}$", "$6.626 * {10^{-34}}$", "$-1.602 * {10 ^{-19}}$", "$1.802 * {10^{1}}$")
)

knitr::kable(format = "html", a, digits = 35)
```

这会给你这样的输出:

在此处输入图像描述

于 2022-01-28T08:42:49.067 回答