Как связать flextable с помощью loop в файле rmd - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь создать несколько таблиц, используя пакеты flextable и kable .Когда я хочу выводить некоторые таблицы итеративно, я обнаружил, что knit_print flextable не работает в цикле.Ниже приведен минимальный пример:

---
output: word_document
---

```{r}
library(flextable)
library(knitr)
```

```{r}
 data(cars)
     speed<-unique(cars$speed)
for (v in 1:length(speed)) {
  carspd<-cars[which(cars$speed==speed[v]),]
  tb<-regulartable(carspd)
knit_print(tb)
}
knit_print(tb)
```

Только последний knit_print может напечатать результат в word_document с файлом .Rmd.


Теперь я нахожу разницуих в .md, который выводится файлом процесса pandoc с ultraedit, правая таблица:

```{=openxml}
<w:tbl xmlns:w=".......

неправильная таблица:

鈥媊``{=openxml}
<w:tbl xmlns:w="

В шестнадцатеричном виде есть дополнительный контент: "E2 80 8B ", кто-то называет их пространством нулевой ширины?Но я не понимаю, как этого избежать.

1 Ответ

0 голосов
/ 05 декабря 2018

Это ограничение одной из функций, которые flextable использует в своем методе knit_print: knitr::asis_output() нельзя использовать в цикле.Здесь описаны несколько решений: https://github.com/yihui/knitr/issues/1137.

Это работает для меня в выводе HTML, просто собирая весь вывод в один большой вектор и распечатывая его в конце.Я изменил код, чтобы также вставить текст перед таблицей и рисунок после него.Я не использую Word, но я предполагаю, что он также будет работать там:

---
output: html_document
---

```{r}
library(flextable)
library(knitr)
```

```{r}
data(cars)
speed <- unique(cars$speed)
results <- character()
for (v in 1:length(speed)) {
  carspd <- cars[which(cars$speed == speed[v]),]
  tb <- regulartable(carspd)

  # Generate a figure in a temporary file
  filename <- tempfile(fileext = ".png")
  png(filename)
  hist(carspd$dist)
  dev.off()

  # Put everything into the results vector
  results <- c(results, "\n\nThis is the table for v =", v,
                        knit_print(tb),
                        knitr:::wrap(include_graphics(filename)))

}
asis_output(results)
knit_print(tb)
```

Пара замечаний:

  • Кажется, что \n\n в текстенеобходимо вставить разрыв строки.
  • Функция knitr:::wrap() является недокументированной внутренней функцией в knitr, поэтому могут быть ограничения, о которых я не знаю, и это может привести к ошибке в некоторых будущих версияхknitr.
...