[英]knitr printing list of data.frames with each table on new page
我想在新頁面上打印每個表格的data.frames
list
。 for-loop
工作正常,但需要很長的代碼。 嘗試使用map
function 但無法獲得所需的 output。 無法將\newpage
newpage 命令與map
function 一起使用。 它還提供了一些額外的 output ,例如[[1]] NULL [[2]] NULL
。 任何提示,請。
mt1 <-
matrix(
data = runif(n = 200, min = 101, max = 999)
, nrow = 20
, ncol = 10
, byrow = TRUE
, dimnames = list(LETTERS[1:20], paste0("V", 1:10))
)
df1 <- data.frame(Name = row.names(mt1), mt1)
dfs <-
unname(
split.default(
df1[, -1], as.integer(gl(ncol(df1)-1, 5, ncol(df1) - 1))
)
)
library(kableExtra)
library(tidyverse)
for(i in 1:length(dfs)){
print(
kable(
cbind(df1[1], dfs[i])
, format = 'latex'
, row.names = FALSE
) %>%
row_spec(row = c(0), bold = TRUE, italic = TRUE, align = "l")
)
if(i < length(dfs)) {
cat("\n\n\\newpage\n")
}
}
map(
dfs
, function(x)
print(
kable(
cbind(df1[1], x)
, format = 'latex'
, row.names = FALSE
) %>%
row_spec(row = c(0), bold = TRUE, italic = TRUE, align = "l")
#cat("\n\n\\newpage\n")
)
#if(i < length(x))
#cat("\n\n\\newpage\n")
)
您可以使用purrr::imap
來獲取.y
變量中的索引:
``` r
library(kableExtra)
library(tidyverse)
library(purrr)
mt1 <-
matrix(
data = runif(n = 200, min = 101, max = 999)
,
nrow = 20
,
ncol = 10
,
byrow = TRUE
,
dimnames = list(LETTERS[1:20], paste0("V", 1:10))
)
df1 <- data.frame(Name = row.names(mt1), mt1)
dfs <-
unname(split.default(df1[,-1], as.integer(gl(
ncol(df1) - 1, 5, ncol(df1) - 1
))))
f <- function() {
for (i in 1:length(dfs)) {
print(
kable(
cbind(df1[1], dfs[i])
,
format = 'latex'
,
row.names = FALSE
) %>%
row_spec(
row = c(0),
bold = TRUE,
italic = TRUE,
align = "l"
)
)
if (i < length(dfs)) {
cat("\n\n\\newpage\n")
}
}
}
f_map <- function() {
invisible(dfs %>% purrr::imap(~ {
print(
kable(cbind(df1[1], .x)
, format = 'latex'
, row.names = FALSE) %>%
row_spec(
row = c(0),
bold = TRUE,
italic = TRUE,
align = "l"
)
#cat("\n\n\\newpage\n")
)
if (.y < length(dfs))
cat("\n\n\\newpage\n")
}))
}
identical(capture.output(f()), capture.output(f_map()))
#> [1] TRUE
microbenchmark::microbenchmark( f = {res <- capture.output(f())}, f_map = {res <- capture.output(f_map())})
#> Unit: milliseconds
#> expr min lq mean median uq max neval cld
#> f 7.908510 8.431997 9.662659 9.012099 10.10318 15.42358 100 a
#> f_map 7.983586 8.462561 9.797256 9.150356 10.71692 16.20676 100 a
```
<sup>Created on 2020-07-23 by the [reprex package](https://reprex.tidyverse.org) (v0.3.0)</sup>
正如@CL 所說,這並不比一個簡單的循環更快或更短。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.