我想在 Shiny 中创建一个过滤器,它的工作原理类似于下面的详细信息。
我目前没有任何东西可以使用所描述的功能。我实现的最接近的是使用 selectizeGroupUI/Server。但是来自 shinywidgets 的这个模块确实具有按组搜索的所需输出。
一个表显示有两列,一个 ID_Col 和一个 Tag col 和一个下拉过滤器框。
用户单击过滤器框,所有标签都可用(因为没有过滤)。他们可以滚动或搜索以找到他们的第一个标签选择。
用户选择他们的第一个标签。该表被过滤以显示所有符合该条件的 ID,以及属于该 ID 的所有其他行。并且过滤器将其选项更新为仅包含相关标签。例如:过滤值“a”将返回 ID_2 的所有 3 行和 ID_3 的所有 3 行。并且搜索栏将更新,以便可以选择的第二个标签将仅位于值“x”、“y”和“n”之间因为 ID_2 和 ID_3 有一行值为“a”并且标签与 ID_2 和 ID_3 相关的是“x”、“y”和“n”。
前任:
ID_Col | value
ID_1 | x
ID_1 | y
ID_1 | z
ID_2 | a
ID_2 | x
ID_2 | y
ID_3 | a
ID_3 | n
ID_3 | x
用户从更新的列表中选择第二个标签,并重复上述动作。
- 第二个标签被选中,表仅更新与 tag_1 和 tag_2 相关的 ID。过滤器仅使用与 tag_1 和 tag_2 相关的 ID 的相关标签进行更新。
例如:如果用户选择“y”作为第二个标签,那么过滤器将搜索 ID 与“a”和“y”相关联的 ID。因此,从上述示例返回的唯一 ID 是 ID_2。所以它在实践中应该像下面这样工作。
df <-
data.frame(ID_Col= c(rep("ID1", 3), rep("ID2", 3), rep("ID3", 3)),
value= c("X", "Y", "Z", "X", "Y", "A", "A", "N", "X"))
# first filter returns both ID1 and ID2 because both ID have one row where value == "X"
df %>%
group_by(ID_Col) %>%
filter(any(value== "A"))
# this second filter will return only ID2 because only ID2 has a row where value == "X" AND a row where value == "A"
df %>%
group_by(ID_Col) %>%
filter(any(value== "A") & any(value== "Y"))
这个问题的更复杂的版本是,我有许多类型的标签,例如,如果我们在谈论食谱,则为 1:1 和 1:many。在我的 1:1 表中,我有 recipe_ID、风格(法语或日语或等)、cook_duration 等。但我会有一个 1:many table recipe_ID、成分。
完整的问题是我如何才能做到以上,保留选择更新,将标签类型拆分为单独的过滤器,并让搜索栏查找满足所有标签条件的 ID。
例如:我有很多鸡肉要煮,选择鸡肉作为配料的第一个标签。所有使用鸡肉的食谱都出现了。我也有很多洋葱。tag2 == 洋葱。该表更新为仅包含鸡肉和洋葱的食谱。我没有亚洲成分,所以我会选择意大利语作为我的流派。该表更新为意大利菜谱,使用鸡肉和洋葱。
为了增加另一层复杂性,搜索时最好在 OR 和 AND 之间进行选择。
例如:我刚从亚洲食品店回来,现在我的搜索是针对日本或中国的食谱,其中食谱有鸡肉和洋葱。
先感谢您。
这是我无法逾越的起点。我不确定是否可以使用 selectizeGroup 获得我想要的东西。
df <- data.frame(ID_Col= c(rep("ID1", 3), rep("ID2", 3), rep("ID3", 3)),
value= c("X", "Y", "Z", "X", "Y", "A", "A", "N", "X"))
ui <-
fluidPage(
fluidRow(
column(
width = 10, offset = 1,
tags$h3("example"),
panel(
selectizeGroupUI(
id = "my-filters",
inline = TRUE,
params = list(
value_filter = list(
inputId = "value",
title = "value filter"
# placeholder = 'select'
)
)
),
status = "primary"
),
DTOutput("table")
)
)
)
server <- function(input, output, session) {
##### Filters
res_mod <- callModule(
module = selectizeGroupServer,
id = "my-filters",
data = df,
vars = c("value")
)
output$table <- renderDT({
res_mod()
})
}
shinyApp(ui = ui, server = server)