0

我想在 Shiny 中创建一个过滤器,它的工作原理类似于下面的详细信息。

我目前没有任何东西可以使用所描述的功能。我实现的最接近的是使用 selectizeGroupUI/Server。但是来自 shinywidgets 的这个模块确实具有按组搜索的所需输出。

  1. 一个表显示有两列,一个 ID_Col 和一个 Tag col 和一个下拉过滤器框。

  2. 用户单击过滤器框,所有标签都可用(因为没有过滤)。他们可以滚动或搜索以找到他们的第一个标签选择。

  3. 用户选择他们的第一个标签。该表被过滤以显示所有符合该条件的 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

用户从更新的列表中选择第二个标签,并重复上述动作。

  1. 第二个标签被选中,表仅更新与 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)
4

0 回答 0