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)
我不确定是否有一种可反应的本机方法来设置初始过滤器,但我一直在通过 jquery 设置文档加载过滤器,没有任何问题。您可以通过代码块包含以下内容js或htmltools::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 代码的部分也有一些有用的讨论。