如何 knit_print 在 rmd 文件中循环使用 flextable
How to knit_print flextable with loop in a rmd file
我正在尝试使用 flextable 和 kable 包生成多个 tables。当我想迭代输出一些 table 时,我发现 flextable 的 knit_print
没有在循环中工作。下面是一个最小的例子:
---
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
可以用.Rmd
文件打印结果到word_document
现在我在.md
中找到了它们的区别,这是用ultraedit的pandoc进程文件输出的,
右边 table:
```{=openxml}
<w:tbl xmlns:w=".......
错了table:
鈥媊``{=openxml}
<w:tbl xmlns:w="
在十六进制中有额外的内容:"E2 80 8B",有人称他们为零宽度Space?但是我不知道如何避免它。
这是 flextable
在其 knit_print
方法中使用的函数之一的限制:knitr::asis_output()
不能在循环中使用。这里描述了几个解决方案:https://github.com/yihui/knitr/issues/1137.
这个在 HTML 输出中对我有用,只需将所有输出收集到一个大向量中并在最后打印出来。我修改了代码,在 table 之前也插入了一些文本,在它之后插入了一个数字。
我不使用 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
中未记录的内部函数,因此可能存在我不知道的限制,这可能会在 [=16= 的某些未来版本中失败].
我正在尝试使用 flextable 和 kable 包生成多个 tables。当我想迭代输出一些 table 时,我发现 flextable 的 knit_print
没有在循环中工作。下面是一个最小的例子:
---
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
可以用.Rmd
文件打印结果到word_document
现在我在.md
中找到了它们的区别,这是用ultraedit的pandoc进程文件输出的,
右边 table:
```{=openxml}
<w:tbl xmlns:w=".......
错了table:
鈥媊``{=openxml}
<w:tbl xmlns:w="
在十六进制中有额外的内容:"E2 80 8B",有人称他们为零宽度Space?但是我不知道如何避免它。
这是 flextable
在其 knit_print
方法中使用的函数之一的限制:knitr::asis_output()
不能在循环中使用。这里描述了几个解决方案:https://github.com/yihui/knitr/issues/1137.
这个在 HTML 输出中对我有用,只需将所有输出收集到一个大向量中并在最后打印出来。我修改了代码,在 table 之前也插入了一些文本,在它之后插入了一个数字。 我不使用 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
中未记录的内部函数,因此可能存在我不知道的限制,这可能会在 [=16= 的某些未来版本中失败].