Using Crosstalk

The rsc_table(), rsc_grid(), rsc_search(), and rsc_filter() widgets use crosstalk to facilitate inter-widget communication. In simple cases, passing identical results from the content() tibble is sufficient:

library(connectwidgets)
library(dplyr)
library(purrr)
library(htmltools)

client <- connect()
all_content <- client %>% content()
some_content <- slice_sample(all_content, prop = .1)

tagList(
  rsc_cols(rsc_search(some_content), rsc_filter(some_content)),
  rsc_table(some_content)
)

For more complicated layouts, you may want to pass your own crosstalk objects to the components.

Example: Grids grouped by owner

As a publisher, you want to:

  • display each content owner’s username with a level 4 heading
  • display an rsc_grid() of each content owner’s items
  • display one search and filter widget that works across all the card grids

crosstalk::SharedData$new() takes two optional parameters that make this possible:

  • keys
    • The content() tibble contains a globally unique identifier (GUID) for each piece of content, which you can use as a key when creating your SharedData object (e.g key = ~ guid).
  • group
    • Specifying a group name when creating the SharedData object gives you control over which widgets are grouped together (e.g. group = "xfilter").

Since the some_content tibble contains all the GUIDs, passing it to the Search and Filter components will enable you to search across each of the subset tibbles created by dplyr::group_nest:

some_content_xfilter <- crosstalk::SharedData$new(
  some_content,
  key = ~ guid,
  group = "xfilter"
  )

rsc_content_shared <-
  some_content %>%
  group_nest(owner_username, .key = "content_df", keep = TRUE)

div(
  h3("Grouped Grids by Owner", class = "text-center"),
  rsc_cols(rsc_search(some_content_xfilter), rsc_filter(some_content_xfilter)),
  purrr::pmap(
    rsc_content_shared,
    {
      ~ tagList(
        h4(..1),
        rsc_grid(crosstalk::SharedData$new(..2, key = ~ guid, group = "xfilter"))
      )
    }
  )
)