1. ホーム
  2. r

[解決済み] Shinyで条件パネルを非表示にするには?

2022-02-08 21:12:47

質問

Shinyで条件パネルを非表示にする方法を教えてください。以下の例をご覧ください。

library(shiny)

ui <- fluidPage(
  actionButton("eval","Evaluate"),
  numericInput("num_input", "If number is changed, cp must hide", value = 0),
  conditionalPanel(
      condition = "input.eval",
      "text"))

server <- function(input, output, session) {
  observeEvent(input$num_input, {
    input$eval <- 0
  })}

shinyApp(ui, server)

私が実現したいことは ユーザーが評価ボタンをクリックすると、条件パネルが表示されます。 num_input を変更すると、パネルが消えるはずです。私のアイデアは、evaluate-buttonをnullにすることでしたが、これはうまくいきません(アプリは灰色の背景で開き、フリーズしているように見えます)。

また shinyjs というように

library(shiny)
library(shinyjs)

ui <- fluidPage(
  useShinyjs(),
  actionButton("eval","Evaluate"),
  numericInput("num_input", "If number is changed, cp must hide", value = 0),
  conditionalPanel(
      id = "cond_panel",
      condition = "input.eval",
      "text"))

server <- function(input, output, session) {
  observeEvent(input$num_input, {
    reset("cond_panel")})}

shinyApp(ui, server)

しかし、これもうまくいきません。アプリは定期的に開き、evaluateボタンをクリックすると条件パネルが表示されますが、数値が変更されると何も起こりません。

どうすればいいですか?

出力値を作成し、それを条件パネルだけに使用することができます。ダイナミックUIの記事で、その方法を解説しています。

http://shiny.rstudio.com/articles/dynamic-ui.html

条件には出力値も使用でき、同じように動作します(output.fooは出力fooの値を与えます)。R式を条件式の引数として使いたい場合は、サーバー関数内で反応式を作成し、それを新しい出力に代入して、条件式でその出力を参照することができます。

この場合、必ず outputOptions(output, [newOutputName], suspendWhenHidden = FALSE) もセットしてください。(これは通常、Shinyが非表示またはUIに存在しない出力に対してブラウザに値を送信しないため、必要なことです。しかし、この場合、contitionalPanel関数の条件を正しく評価するために、ブラウザは最新の出力値を知る必要があります - suspendWhenHidden = FALSEは、これが起こることを保証します)。

library(shiny)

ui <- fluidPage(
  actionButton("eval","Evaluate"),
  numericInput("num_input", "If number is changed, cp must hide", value = 0),
  conditionalPanel("input.eval && !output.hide_panel", "text")
)

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

  output$hide_panel <- eventReactive(input$num_input, TRUE, ignoreInit = TRUE)

  outputOptions(output, "hide_panel", suspendWhenHidden = FALSE)
}

shinyApp(ui, server)

別の方法として renderUI を表示し、条件パネルが input$num_input が変更されます。