代码之家  ›  专栏  ›  技术社区  ›  MYaseen208

R打印每个数据。将列表的`框成单独的表格,标题为`数据。框架名称和描述

  •  0
  • MYaseen208  · 技术社区  · 4 年前

    我的后续行动 earlier question . (感谢@akrun的帮助。)

    要打印每个吗 data.frame 将列表分成单独的表格,标题如下 数据框架 来自另一个对象的名称和描述。我的代码如下。无法在标题表中获取描述。

    我错过了什么?

    如果这是可行的:

    Names1 %>% 
          filter(Name == quote(df1)) %>% 
          pull(Desp)
    

    为什么这在里面不起作用 imap ?

    Names1 %>% 
     filter(Name == quote(.y)) %>% 
     pull(Desp)
    

    完整代码

    library(tidyverse)
    library(kableExtra)
    #> 
    #> Attaching package: 'kableExtra'
    #> The following object is masked from 'package:dplyr':
    #> 
    #>     group_rows
    
    df1 <- data.frame(X = 1:3)
    df2 <- data.frame(Y = 5:6)
    
    ls1 <-
      list(df1, df2) %>% 
      set_names(c("df1", "df2"))
    
    ls1
    #> $df1
    #>   X
    #> 1 1
    #> 2 2
    #> 3 3
    #> 
    #> $df2
    #>   Y
    #> 1 5
    #> 2 6
    
    Names1 <- 
      tibble(
        Name = c("df1", "df2")
      , Desp = c("Desp1", "Desp2")
      )
    
    Names1
    #> # A tibble: 2 x 2
    #>   Name  Desp 
    #>   <chr> <chr>
    #> 1 df1   Desp1
    #> 2 df2   Desp2
    
    Names1 %>% 
      filter(Name == quote(df1)) %>% 
      pull(Desp)
    #> [1] "Desp1"
    
    
    imap(
        .x = ls1
      , .f = ~ {
        kbl(
           x       = .x
         , format  = "markdown"
         , caption = paste0("Test ", .y, " ( ", 
                            Names1 %>% 
                              filter(Name == quote(.y)) %>% 
                              pull(Desp)
                            , " )"
                            )
        )
        }
      )
    #> $df1
    #> 
    #> 
    #> Table: Test df1 (  )
    #> 
    #> |  X|
    #> |--:|
    #> |  1|
    #> |  2|
    #> |  3|
    #> 
    #> $df2
    #> 
    #> 
    #> Table: Test df2 (  )
    #> 
    #> |  Y|
    #> |--:|
    #> |  5|
    #> |  6|
    
    0 回复  |  直到 4 年前
        1
  •  1
  •   user63230    4 年前

    .y 已在中引用 imap 从第一部分的输出可以看出 paste0("Test ", .y, " ( ", 它回来了 Table: Test df1 ( 所以你不需要报价。

    注:

    Names1 %>% 
      filter(Name == "df1") %>% 
      pull(Desp)
    # [1] "Desp1"
    

    因此,如果你不包括报价,它是有效的:

    imap(
      .x = ls1
      , .f = ~ {
        kbl(
          x       = .x
          , format  = "markdown"
          , caption = paste0("Test ", .y, " ( ", 
                             Names1 %>% 
                               filter(Name == .y) %>% 
                               pull(Desp)
                             , " )"
          )
        )
      }
    )
    # $df1
    
    
    # Table: Test df1 ( Desp1 )
    
    # |  X|
    # |--:|
    # |  1|
    # |  2|
    # |  3|
    
    # $df2
    
    
    # Table: Test df2 ( Desp2 )
    
    # |  Y|
    # |--:|
    # |  5|
    # |  6|
    

    你做这件事的方式是过滤数据中没有的东西。框架( Y ).请看这里:

    imap(
      .x = ls1
      , .f = ~ {
        .y
      }
    )
    # $df1
    # [1] "df1"
    
    # $df2
    # [1] "df2"
    
    
    imap(
      .x = ls1
      , .f = ~ {
        quote(.y)
      }
    )
    # $df1
    # .y
    
    # $df2
    # .y