Flextable: использование надстрочного индекса в кадре данных - PullRequest
0 голосов
/ 03 октября 2019

Этот вопрос задавался несколько раз, но, как ни странно, ответа не было.

Я хочу, чтобы некоторые цифры в моем фрейме данных отображались в верхнем индексе. Функции compose и display здесь не подходят, так как я пока не знаю, какие значения в моем фрейме данных появятся в верхнем индексе (мои таблицы генерируются автоматически).

Я пытался использовать ^8^как для kable, $$10^-3$$, paste(expression(10^2)), "H\\textsubscript{123}" и т. д.

Ничего не работает !! Помогите ! Я вырываю волосы ...

library(flextable)
bab = data.frame(c( "10\\textsubscript{-3}", 
paste(as.expression(10^-3)), '10%-3%', '10^-2^' ))
flextable(bab)

Я вяжу с R до html.

1 Ответ

1 голос
/ 04 октября 2019

В HTML вы делаете надстрочные знаки, используя такие вещи, как <sup>-3</sup>, и подписки, используя <sub>-3</sub>. Однако, если вы поместите их в ячейку таблицы, вы увидите полный текст, который будет отображаться, он не будет интерпретироваться как HTML, поскольку flextable экранирует угловые скобки.

* kable()Функция имеет аргумент escape = FALSE, который может отключить это, но flextable этого не делает: см. https://github.com/davidgohel/flextable/issues/156. Однако, есть хакерский способ обойти это ограничение: замените функцию htmlEscape() на функцию, котораяничего не делает.

Например,

```{r}
library(flextable)
env <- parent.env(loadNamespace("flextable")) # The imports
unlockBinding("htmlEscape", env)
assign("htmlEscape", function(text, attribute = FALSE) text, envir=env)
lockBinding("htmlEscape", env)
bab = data.frame(x = "10<sup>-3</sup>")
flextable(bab)
``` 

Таблица будет отображаться как

screenshot

Будьте осторожныесли вы сделаете это: в ваших реальных таблицах могут быть случаи, когда вы действительно хотите экранирование HTML, и этот код отключит это для остальной части документа. Если вы выполните этот код в сеансе R, он отключит экранирование до конца сеанса.

И если вы думаете об использовании такого документа в пакете, который вы отправляете в CRAN, забудьте об этом. Вы не должны связываться с подобными привязками в коде, который, как вы ожидаете, будут использовать другие люди.

Отредактировано, чтобы добавить:

Фактически, есть способ сделатьэто без взлома, приведенного выше. Это описано в этой статье: https://davidgohel.github.io/flextable/articles/display.html#sugar-functions-for-complex-formatting. Идея состоит в том, чтобы заменить записи, для которых требуются верхние индексы или индексы, вызовами as_paragraph, as_sup, as_sub и т. Д.:

```{r}
library(flextable)
bab <- data.frame(x = "dummy")
bab <- flextable(bab)
bab <- compose(bab, part = "body", i = 1, j = 1,
         value = as_paragraph("10",
                              as_sup("-3")))
bab
```

Это определенно безопаснее, чем метод, который я дал.

...