【问题标题】:knitr printing list of data.frames with each table on new pageknitr 在新页面上打印每个表格的 data.frames 列表
【发布时间】:2020-11-10 12:11:22
【问题描述】:

我想在新页面上打印data.frameslistfor-loop 工作正常,但需要长代码。尝试使用 map 函数,但无法获得所需的输出。无法将\newpage 命令与map 功能一起使用。它还提供了一些额外的输出,例如[[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")
  )

【问题讨论】:

  • 当您说“新页面”时,您正在创建什么样的文档?您是在将 .Rmd 编​​织成 html 吗?
  • .Rnw文件。
  • 我很难理解如何使用 for 编写代码“更长”或者不如 map 版本(在这种情况下)。您是否只是为了 [某事] 而避免命令式编程而采用函数式方法...?
  • 我和@CL 有同样的困难。for 循环在这里似乎是完全合法的。我真的不明白必须使用purrr::map() 的意义。

标签: r for-loop tidyverse knitr purrr


【解决方案1】:

您可以使用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 所说,这并不比简单循环更快也更短。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-16
    • 1970-01-01
    相关资源
    最近更新 更多