#r #shiny #tags #shinydashboard #shinywidgets
#r #блестящий #Теги #shinydashboard #shinywidgets
Вопрос:
Я хочу создать фильтр в Shiny, который будет работать, как показано ниже.
В настоящее время у меня нет ничего близкого к работе с описанной функциональностью. Самое близкое, чего я достиг, — это использование selectizeGroupUI / Server. Но этот модуль от shinywidgets действительно имеет желаемый результат поиска по группе.
-
Отображается таблица с двумя столбцами: ID_Col и col тега, а также раскрывающимся полем фильтра.
-
Пользователи нажимают на поле фильтра, и все теги доступны (поскольку ничего не фильтруется). Они могут прокручивать или выполнять поиск, чтобы найти свой первый выбранный тег.
-
Пользователь выбирает свой первый тег. Таблица фильтруется, чтобы показать все идентификаторы, соответствующие этим критериям, а также все остальные строки, принадлежащие этому идентификатору. И фильтр обновляет свои варианты, чтобы включать только релевантные теги. пример: фильтрация по значению «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 И тегом_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, вы увидите, что я хочу сделать.