web-dev-qa-db-ja.com

R Shiny Appのチェックボックスの値を保持する方法は?

光沢のあるアプリを作成しようとしています。この特定のアプリにはラジオボタンのセットがあり、1つを選択すると以下のオプションのセットがチェックボックスとして表示され、別のラジオボタンを選択すると他のオプションのセットが選択されます。以下のUIとサーバーコードを見つけてください。

library(shiny)
library(shinydashboard)
library(shinyWidgets)

d <-
  data.frame(
    year = c(1995, 1995, 1995, 1996, 1996, 1996, 1997, 1997, 1997),
    Product_Name = c(
      "Table",
      "Chair",
      "Bed",
      "Table",
      "Chair",
      "Bed",
      "Table",
      "Chair",
      "Bed"
    ),
    Product_desc = c("X", "X", "X", "Y", "Y", "Y", "Z", "Z", "Z"),
    Cost = c(1, 2, 3, 4, 2, 3, 4, 5, 6)
  )

ui <- shinyUI(fluidPage(
  useShinydashboard(),
  tabPanel(
    "Plot",
    sidebarLayout(
      sidebarPanel(
        radioButtons(
          "Choose",
          "Choose One",
          c("Year" = "p", "Numbers" = "l")
        ),
        uiOutput('checkbox'),
        #width = 2,
        position = "bottom"),
      mainPanel(uiOutput("graph"))

    )
  )
))

server <- function(input, output, session) {

  output$graph <- renderUI({
    # create tabPanel with datatable in it
    req(input$year)
    tabPanel("Plots",
             fluidRow(lapply(as.list(paste0("plot", seq_along(input$year))), plotOutput)))

  })

  output$checkbox <- renderUI({
    if (input$Choose == "p") {
      checkboxGroupInput("Cross",
                         "Year",
                         choices = (unique(d$year)))

    } else{
      checkboxGroupInput("Cross_1",
                         "Numbers",
                         choices = c("1","2","3"))
    }

  })

}

shinyApp(ui, server)

今私が直面している課題は、「年」ラジオボタンを選択すると年の値がチェックボックスとして表示され、チェックボックスを選択すると対応するグラフがメインパネルに表示されることです(ここではコードを指定していません) )。 「番号」ラジオボタンを選択すると、正しいチェックボックスオプションが表示されます。しかし、「年」ラジオボタンに戻ると、すでに選択されているチェックボックスの値は保持されないため、ユーザーはボックスを再度チェックして、対応するグラフを取得する必要があります。

私の場合、CheckboxGroupInput()の選択肢は動的です。したがって、UI()でこの選択を行うことはできません。また、失敗したupdateCheckboxGroupInput()を使用してみました。もう一度コードを調査したところ、問題が発生しているのはコードのこの部分であることがわかりました。

  output$checkbox <- renderUI({
    if (input$Choose == "p") {
      checkboxGroupInput("Cross",
                         "Year",
                         choices = (unique(d$year)))

    } else{
      checkboxGroupInput("Cross_1",
                         "Numbers",
                         choices = c("1","2","3"))
    }

  })

別のラジオボタンが選択されている場合でも、チェックボックスの値を保持する方法を教えてください。また、各ラジオボタンの下のチェックボックスのオプションは、ユーザーが前のタブで選択したオプションに応じて変化することにも注意してください。だから私は対応するチェックボックスを取得するために関数を観察します。

5
David Chris

これに対する私のアプローチは、hiddenshinyjsを使用することです。また、デフォルトの選択が空になるように追加したので、反応性にあいまいさがありません。 "1""2"などの名前に数値変数を単独で使用しないようにしてください

library(shiny)
library(shinydashboard)
library(shinyWidgets)
library(shinyjs)

d <- data.frame(
    year = c(1995, 1995, 1995, 1996, 1996, 1996, 1997, 1997, 1997),
    Product_Name = c("Table","Chair","Bed","Table","Chair","Bed","Table","Chair","Bed"),
    Product_desc = c("X", "X", "X", "Y", "Y", "Y", "Z", "Z", "Z"),
    Cost = c(1, 2, 3, 4, 2, 3, 4, 5, 6)
)

ui <- shinyUI(fluidPage(
    useShinyjs(),
    useShinydashboard(),
    tabPanel("Plot",
             sidebarLayout(
                 sidebarPanel(
                     radioButtons("Choose","Choose One", c("Year" = "p", "Numbers" = "b"),selected = character(0)),
                     uiOutput('checkbox'),
                     position = "bottom"),
                 mainPanel(
                     uiOutput("graph")
                 )

             )
    )
))

server <- function(input, output, session) {

    output$checkbox <- renderUI({
        hidden(
            tagList(
                checkboxGroupInput("Cross","Year",choices = (unique(d$year))),
                checkboxGroupInput("Cross_1","Numbers",choices = c("1","2","3"))
            )
        )
    })

    observeEvent(input$Choose,{
        toggleElement(id = "Cross", condition = input$Choose == "p")
        toggleElement(id = "Cross_1", condition = input$Choose == "b")
    })

}

shinyApp(ui, server)

enter image description here

または、radioButtonsデフォルトでは最初の値を選択するため、2番目の要素を非表示にすることができます。

ui <- shinyUI(fluidPage(
    useShinyjs(),
    useShinydashboard(),
    tabPanel("Plot",
             sidebarLayout(
                 sidebarPanel(
                     radioButtons("Choose","Choose One", c("Year" = "p", "Numbers" = "b")),
                     uiOutput('checkbox'),
                     position = "bottom"),
                 mainPanel(
                     uiOutput("graph")
                 )

             )
    )
))

server <- function(input, output, session) {

    output$checkbox <- renderUI({
        tagList(
            checkboxGroupInput("Cross","Year",choices = (unique(d$year))),
            hidden(checkboxGroupInput("Cross_1","Numbers",choices = c("1","2","3")))
        )
    })

    observeEvent(input$Choose,{
        toggleElement(id = "Cross", condition = input$Choose == "p")
        toggleElement(id = "Cross_1", condition = input$Choose == "b")
    })

}

shinyApp(ui, server)
1
Pork Chop