将默认过滤器设置为 R 中的可反应表

Mor*_*s81 5 r reactable

R 的 Reactable 包引入了自定义过滤列的功能。

可反应的自定义过滤

上面的链接有一些关于如何将下拉(选择)列表添加到特定列的很好的示例,但是我发现很难弄清楚如何在表加载时添加默认的过滤值。

请参阅下面的示例(从上述链接修改),我将如何加载表并包含按Manufacturer值过滤的列Acura

library(reactable); library(htmltools)

data <- MASS::Cars93[, c("Manufacturer", "Model", "Type", "Price")]

reactable(
  data,
  filterable = TRUE,
  columns = list(
    Manufacturer = colDef(
      filterInput = function(values, name) {
        tags$select(
          onchange = sprintf("Reactable.setFilter('cars-select', '%s', event.target.value)", name),
          lapply(unique(values), tags$option),
          style = "width: 100%; height: 28px;"
        )
      }
    )
  ),
  defaultPageSize = 5,
  elementId = "cars-select"
)
Run Code Online (Sandbox Code Playgroud)

lio*_*ens 1

我不确定是否有一种可反应的本机方法来设置初始过滤器,但我一直在通过 jquery 设置文档加载过滤器,没有任何问题。您可以通过代码块包含以下内容jshtmltools::tags$script(...)

$(document).ready(() => Reactable.setFilter('cars-select', 'Manufacturer', "Acura"));
Run Code Online (Sandbox Code Playgroud)

我相信在某些情况下,该表在文档就绪时不可用,因此解决方案htmlwidgets::onStaticRenderComplete(...)可能更好,但我无法使其在针织文档中工作(尽管它在 RStudio 中以交互方式工作)。

library(reactable); library(htmltools)

data <- MASS::Cars93[, c("Manufacturer", "Model", "Type", "Price")]

tagList(
  reactable(
    data,
    filterable = TRUE,
    columns = list(
      Manufacturer = colDef(
        filterInput = function(values, name) {
          tags$select(
            onchange = sprintf("Reactable.setFilter('cars-select', '%s', event.target.value)", name),
            lapply(unique(values), tags$option),
            style = "width: 100%; height: 28px;"
          )
        }
      )
    ),
    defaultPageSize = 5,
    elementId = "cars-select"
  ),
  # The added code chunk
  htmlwidgets::onStaticRenderComplete("Reactable.setFilter('cars-select', 'Manufacturer', 'Acura')")
)
Run Code Online (Sandbox Code Playgroud)

onStateChange()在Reactable 的 javascript-api 文档部分中,关于渲染后添加 javascript 代码的部分也有一些有用的讨论。