起動時にデータセットをロードするシンプルな光沢のあるアプリがあります。アプリにはselectizeInput()
、ユーザーがデータセットをフィルター処理できるさまざまな変数の 1 つ以上の値を選択できる場所が異なります。次の再現可能な例では、フィルタリング時にサーバーで作成したリアクティブ データセットがテーブルに表示されています。
library(dplyr)
library(shiny)
dataset <- data.frame("Letters" = c("A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C", "A", "B", "C"),
"Numbers" = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 1, 2, 3, 4, 5, 6, 7, 8, 9),
"LettersNumbers" = c("G5", "G5", "G5", "G5", "G5", "G5", "F7", "F7", "F7", "F7", "F7", "F7", "E9", "E9", "E9", "E9", "E9", "E9"))
ui <- fluidPage(
br(),
fluidRow(
column(width = 4,
selectizeInput(inputId = "letters",
label = "Letters",
choices = unique(dataset$Letters),
multiple = TRUE),
br(),
selectizeInput(inputId = "numbers",
label = "Numbers",
choices = unique(dataset$Numbers),
multiple = TRUE),
br(),
selectizeInput(inputId = "lettersnumbers",
label = "Letters & Numbers",
choices = unique(dataset$LettersNumbers),
multiple = TRUE)
),
column(width = 4,
tableOutput(outputId = "table")
),
column(width = 4,
textOutput(outputId = "text")
)
)
)
server <- function(input, output, session) {
# Filter the initial dataset
dataset_filtered <- reactive({
dataset_filtered <- dataset
if (!is.null(input$letters)) {
dataset_filtered <- dataset_filtered %>%
filter(Letters %in% c(input$letters))
}
if (!is.null(input$numbers)) {
dataset_filtered <- dataset_filtered %>%
filter(Numbers %in% c(input$numbers))
}
if (!is.null(input$lettersnumbers)) {
dataset_filtered <- dataset_filtered %>%
filter(LettersNumbers %in% c(input$lettersnumbers))
}
return(dataset_filtered)
})
# Display filtered table
output$table <- renderTable({
dataset_filtered()
})
# Display warning message
output$text <- renderText({
if (nrow(dataset_filtered()) == 0) {
print("No combinations available")
}
})
}
shinyApp(ui = ui, server = server)
問題: 3 つの変数の重要性がまったく同じです。フィルタリングの例を見てみましょう。値AとBを選択したとします。表からわかるように、Numbers列には1から8までの値しかありませんが、 9はありません。ここで、2 番目selectizeInput()
( Numbers ) で9を選択すると、テーブルには予想どおり 0 行があり、警告メッセージが表示されます。ただし、同じものから9と1selectizeInput()
の両方を選択すると、フィルターが1を考慮するため、いくつかの値が表示されます。作成されたリアクティブベクターで利用可能であり、そのためだけにフィルターをかけます。
私の意見では、このインターフェースをプログラムする最良の方法はselectizeInput()
、それらのいずれかが選択されるたびに事後対応的に更新することです。つまり、最初の入力からAとBを選択した場合、2 番目の入力で数字9を使用できないはずです。これは、私が持っているすべての入力に対して有効である必要があります。他の入力よりも重要な入力はありません。
私もいくつかの解決策を試しましupdateSelectizeInput()
たが、何もうまくいかないようです。何か提案はありますか?ありがとう!