将 facet wrap 与数据 table 对象一起使用

Use facet wrap with a data table object

我正在使用 DT 包,我想在一个数据集的单独窗格中显示两个 table。

理想情况下,我想要像 facet wrap 这样的东西,它可以让我根据计划 ID 制作 tables。我想要一个 table 包含个人计划的所有值,另一个 table 包含团队计划的所有值。我可以走很远的路,制作两个单独的数据集,但我希望我可以做一些更有效的事情

这是我的数据

structure(list(first_month = structure(c(17532, 17532, 17563, 
17563, 17591, 17591, 17622, 17622, 17652, 17652), class = "Date"), 
    plan_id = c("personal", "team", "personal", "team", "personal", 
    "team", "personal", "team", "personal", "team"), new_customers = c(16, 
    32, 27, 33, 19, 41, 36, 46, 48, 46), `1` = c(16, 32, 27, 
    33, 19, 41, 36, 46, 48, 46), `2` = c(13, 29, 24, 30, 15, 
    37, 31, 40, 43, 38), `3` = c(13, 26, 22, 28, 14, 31, 30, 
    40, 36, 35), `4` = c(10, 20, 22, 22, 12, 29, 27, 39, 32, 
    33), `5` = c(10, 18, 20, 20, 11, 25, 22, 36, 27, 27), `6` = c(10, 
    16, 16, 20, 9, 24, 19, 34, 24, 25), `7` = c(10, 12, 13, 18, 
    7, 24, 16, 32, 21, 23), `8` = c(8, 10, 10, 14, 7, 21, 16, 
    30, 19, 21), `9` = c(7, 8, 7, 12, 7, 18, 16, 25, NA, NA), 
    `10` = c(7, 7, 5, 11, 6, 14, NA, NA, NA, NA), `11` = c(5, 
    6, 5, 10, NA, NA, NA, NA, NA, NA), `12` = c(5, 6, NA, NA, 
    NA, NA, NA, NA, NA, NA)), row.names = c(NA, -10L), class = c("tbl_df", 
"tbl", "data.frame"))

这是我的代码

  datatable(monthly_new_customer_cohorts_formatted_as_cohort_analysis_customer_counts,
            class = 'cell-border stripe',
            rownames = FALSE,
            options = list(
              ordering=F,
              dom = 't',
              pageLength = 1000))

可能不是最巧妙的答案,但希望这会有所帮助。您可以使用 group_bynestmutatemap2 基于 plan_id 创建单独的 data-sets,然后从每个创建单独的 DT 小部件.

library(dplyr)
library(tidyr)
library(purrr)

# Separate data for each plan_id value:
widgets <- monthly_new_customer_cohorts_formatted_as_cohort_analysis_customer_counts %>% 
  group_by(plan_id) %>% nest()

# For each data subset, create a separate DT widget:
widgets <- widgets %>% mutate(dt_widget = map2(.y = plan_id, .x = data, .f = function(x,y){
  datatable(x,class = 'cell-border stripe',caption = y,
            rownames = FALSE,options = list(
              ordering=F,
              dom = 't',
              pageLength = 1000),
            height = "100%",width = "100%")}))

widgets$dt_widget 的每个元素现在都是一个单独的 datatable 小部件。现在的技巧是将它们全部放在同一个查看器中:

library(htmltools)
browsable(x = 
  tagList(lapply(
    widgets$dt_widget,function(x) tags$div(x)))
)

不幸的是,我不认为有一个函数可以为您提供漂亮的网格ala ggplot2::facet_wrap(例如,9 个面的 3x3 网格),但您可以通过调整样式值来手动执行此操作 div个元素。例如,这允许表格通过减少宽度和调整浮点数在同一行上:

browsable(
  tagList(list(
    tags$div(
      widgets$dt_widget[[1]],
      style = 'width:49%;display:block;float:left;'
    ),
    tags$div(
      widgets$dt_widget[[2]],
      style = 'width:49%;display:block;float:right;')
    )
  ))