web-dev-qa-db-ja.com

R Shiny-shinyUI要素を無効化/有効化

shinyUI要素の機能を無効/有効にするを実装する方法を探しています。 ここxiaodaighactionButtonを無効/有効にする方法のヒントを提供し(以下の画像を参照)、これは私の望ましい結果ですが、コードは、私がテストした他のgui要素(例:numericInput)でトリックを実行しません。

(私はconditionalPanel機能を知っていますが、これは私が望む効果ではありません。)

特にJavaScriptにあまり詳しくないので、どんな提案も強く感謝します。

enter image description here

36
Marta Karas

質問にリンクするコードが他の入力ウィジェットに対して機能しない理由は、入力ウィジェットごとに無効にするために異なるJavaScript呼び出しが必要になるためです。別の問題は、shinyがinput要素を作成するときに、提供するIDが実際のHTML入力タグのIDである場合と、そのIDがinputタグのコンテナーに与えられる場合があることです。

shinyjs パッケージには、光沢のある入力でそのまま機能するdisable関数があります。免責事項:私はそのパッケージを書きました。

あなたが尋ねたようにnumericInputを無効にする方法は次のとおりです

library(shiny)
runApp(shinyApp(
  ui = fluidPage(
    shinyjs::useShinyjs(),
    numericInput("test", "Test", 5),
    actionButton("submit", "Choose")
  ),
  server = function(input, output, session) {
    observeEvent(input$submit, {
      shinyjs::disable("test")
    })
  }
))
49
DeanAttali

Dean Attali によって提案されたコードは、実際にわずかに変更して、要求に応じて有効化と無効化を実現できます。以下の例を参照してください。これは、指定された値に応じてスライダーをアクティブまたは非アクティブにします(値が範囲の最大値を超える場合、スライダーは非アクティブになります)。

library(shiny)
runApp(shinyApp(
    ui = fluidPage(
        shinyjs::useShinyjs(),
        numericInput("val", "Choose value (max 10)", 5),
        sliderInput(inputId = "range",
                    label = "Range",
                    min = 0,
                    max = 10,
                    step = 0.1,
                    value = c(0,2))
    ),
    server = function(input, output, session) {
        observeEvent(input$val, {
            if(input$val <= 10){
                shinyjs::enable("range")
            }else{
                shinyjs::disable("range")
            }
        })
    }
))

3
tokami

特定の条件がFALSEのときに要素が「消える」としたらどうでしょう。

これがあなたの意図であれば、これをサーバーに追加できます。

output$sliderInputUI <- renderUI({
    if (condition == TRUE) {
        sliderInput("id", "text", 
             min = 1, max = 8, 
             value = 1, step = 1
        )
    }
})

これをui.R htmlOutput( "sliderInputUI")に追加します

sliderInputは、条件がTRUEの場合にのみUIに表示されます。

3
tnaake