Динамическая групповая фильтрация в R Shiny — поиск по репликации тегов

#r #shiny #tags #shinydashboard #shinywidgets

#r #блестящий #Теги #shinydashboard #shinywidgets

Вопрос:

Я хочу создать фильтр в Shiny, который будет работать, как показано ниже.

В настоящее время у меня нет ничего близкого к работе с описанной функциональностью. Самое близкое, чего я достиг, — это использование selectizeGroupUI / Server. Но этот модуль от shinywidgets действительно имеет желаемый результат поиска по группе.

  1. Отображается таблица с двумя столбцами: ID_Col и col тега, а также раскрывающимся полем фильтра.

  2. Пользователи нажимают на поле фильтра, и все теги доступны (поскольку ничего не фильтруется). Они могут прокручивать или выполнять поиск, чтобы найти свой первый выбранный тег.

  3. Пользователь выбирает свой первый тег. Таблица фильтруется, чтобы показать все идентификаторы, соответствующие этим критериям, а также все остальные строки, принадлежащие этому идентификатору. И фильтр обновляет свои варианты, чтобы включать только релевантные теги. пример: фильтрация по значению «a» вернет все 3 строки ID_2 И все 3 строки ID_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
  

Пользователь выбирает 2-й тег из обновленного списка, и вышеуказанные действия повторяются.

  1. Выбран второй тег, таблица обновляется только для идентификаторов, связанных с тегом_1 И тегом_2. Фильтр обновляется только соответствующими тегами для идентификаторов, связанных с tag_1 И tag_2.

пример: если пользователь выбирает «y» в качестве второго тега, тогда фильтр ищет идентификаторы, в которых идентификатор связан как с «a», так И с «y». Таким образом, единственным идентификатором, возвращаемым из приведенного выше примера, является 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") amp; any(value== "Y"))
  

Более сложная версия этого вопроса заключается в том, что у меня есть много типов тегов с соотношением 1: 1 и 1: многие, например, если бы мы говорили о рецептах. В моей таблице 1: 1 у меня был бы recipe_ID, style (французский или японский Или т. Д.), cook_duration и т. Д. Но тогда у меня была бы таблица recipe_ID 1: many, ингредиенты.

Весь вопрос в том, как я могу сделать вышеизложенное, сохранить обновление выбора, разделить типы тегов на отдельные фильтры и заставить строки поиска искать идентификаторы, в которых выполняются ВСЕ условия тега.

пример: мне нужно приготовить много курицы, выберите курицу в качестве первого тега в ingredients . Отображаются все рецепты, в которых используется курица. У меня тоже много лука. tag2 == лук. в таблице отображаются только рецепты с курицей И луком. У меня закончились азиатские ингредиенты, поэтому я выберу итальянский в качестве своего жанра. таблица обновляется до итальянских рецептов с использованием курицы и лука.

Чтобы добавить еще один уровень сложности, было бы неплохо выбирать между ИЛИ и И при поиске.

пример: я только что вернулся из магазина азиатской кухни, теперь я ищу рецепты для японцев ИЛИ китайцев, где в рецептах есть курица И лук.

Заранее благодарю вас.


Это моя отправная точка, мимо которой я не могу пройти. Я не уверен, смогу ли я получить то, что хочу, используя 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)
  

Комментарии:

1. Я не совсем уверен, правильно ли я понял проблему, но я думаю, что ваша проблема становится немного проще с другой структурой данных. Если у вас есть таблица со столбцами, например, style и cook_duration, вы можете ввести входные данные для style и cook_duration. Если вы выбираете определенный тип, вы фильтруете таблицу и обновляете параметры для cook_duration на основе обновленной таблицы. Это сработает для вас?

2. Представьте, что у меня есть таблица, которая имеет значение col1 = recipe_id, col2 = style, col3= ingredients, (от 1, от 1 до многих). Теперь, если бы я хотел выполнить поиск по этим данным, чтобы найти французский рецепт, в котором используется курица И тыква. Как бы ваше решение возвращало каждый recipe_id, где один из перечисленных ингредиентов — курица, а другой — тыква? Я предполагаю, что это сводится к тому, «Как вы создаете фильтр, который выполняет поиск по группе, чтобы соответствовать выбору фильтра 1 И выбору фильтра 2». Если вы запустите кодовый блок df, вы увидите, что я хочу сделать.