Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 如果输入已更改,则启用操作按钮_R_Shiny_Shinyjs - Fatal编程技术网

R 如果输入已更改,则启用操作按钮

R 如果输入已更改,则启用操作按钮,r,shiny,shinyjs,R,Shiny,Shinyjs,我的应用程序应该遵循这样的逻辑:如果按下一个操作按钮,所有输入都将被禁用,并执行长时间的计算。当计算完成并绘制其结果时,除“操作”按钮外的所有输入将再次启用。如果用户决定更改一个输入,则“操作”按钮将启用 除了最后一位操作按钮的启用之外,大多数期望的行为都在工作。这是我的服务器功能(操作按钮名为“go”): 问题在于,在shinny::observeEvent(allinputIds(),shinyjs::enable(“go”))中,您只需检查输入ID的名称/数量是否发生了变化,而不会发生变化

我的应用程序应该遵循这样的逻辑:如果按下一个操作按钮,所有输入都将被禁用,并执行长时间的计算。当计算完成并绘制其结果时,除“操作”按钮外的所有输入将再次启用。如果用户决定更改一个输入,则“操作”按钮将启用

除了最后一位操作按钮的启用之外,大多数期望的行为都在工作。这是我的服务器功能(操作按钮名为“go”):


问题在于,在
shinny::observeEvent(allinputIds(),shinyjs::enable(“go”))
中,您只需检查输入ID的名称/数量是否发生了变化,而不会发生变化。实际上,您需要检查任何输入的值(除了操作按钮)是否已更改。因此,您可以将所有输入直接放入observe,比如
c(input$bins,input$…)
,或者创建一个额外的reactive来检查值,并将其称为reactive

library(shiny)

server <- function(input, output, session) {
  allinputIds <- reactive(names(input))
  
  changingInputValues <- reactive({
    checkIds <- setdiff(names(input), "go")
    lapply(checkIds, function(x) input[[x]])
  })
  
  observeEvent(input$go, {
    lapply(allinputIds(), shinyjs::disable)  
  })
  
  # ==> here is some trouble: not working
  observeEvent(changingInputValues(), shinyjs::enable("go"))
  
  # from here starts the real work
  bins <- eventReactive(input$go, {
    x <- faithful$waiting
    Sys.sleep(1.5)
    seq(min(x), max(x), length.out = input$bins + 1)
  })
  
  output$figure <- renderPlot({
    x <- faithful$waiting 
    hist(
      x, breaks = bins(), col = "#75AADB", border = "white",
      xlab = "Waiting time to next eruption (in mins)",
      main = "Histogram of waiting times"
    )
    
    lapply(setdiff(allinputIds(), "go"), shinyjs::enable)
  })
}

ui <- tagList(
  shinyjs::useShinyjs(), 
  navbarPage(title="Test 2",
                    tabPanel(title="Old Faithful",
                             sidebarLayout(
                               sidebarPanel(
                                 sliderInput(
                                   inputId = "bins",
                                   label = "Number of bins:",
                                   min = 1,
                                   max = 50,
                                   value = 30
                                 )
                               ),
                               mainPanel(
                                 actionButton("go", "Update"),
                                 shinycssloaders::withSpinner(plotOutput(outputId="figure")),
                                 h4(textOutput("msg"))
                               )
                             )
                    )
  )
)

shinyApp(ui, server)
库(闪亮)

完全有意义的服务器。谢谢。
ui <- shiny::tagList(
    shinyjs::useShinyjs(), 
    shiny::navbarPage(title="Test 2",
        tabPanel(title="Old Faithful",
        shiny::sidebarLayout(
            shiny::sidebarPanel(
                    shiny::sliderInput(
                        inputId = "bins",
                        label = "Number of bins:",
                        min = 1,
                        max = 50,
                        value = 30
                    )
                ),
                shiny::mainPanel(
                    shiny::actionButton("go", "Update"),
                    shinycssloaders::withSpinner(plotOutput(outputId="figure")),
                    shiny::h4(shiny::textOutput("msg"))
                )
            )
        )
    )
)

shiny::shinyApp(ui, server)
library(shiny)

server <- function(input, output, session) {
  allinputIds <- reactive(names(input))
  
  changingInputValues <- reactive({
    checkIds <- setdiff(names(input), "go")
    lapply(checkIds, function(x) input[[x]])
  })
  
  observeEvent(input$go, {
    lapply(allinputIds(), shinyjs::disable)  
  })
  
  # ==> here is some trouble: not working
  observeEvent(changingInputValues(), shinyjs::enable("go"))
  
  # from here starts the real work
  bins <- eventReactive(input$go, {
    x <- faithful$waiting
    Sys.sleep(1.5)
    seq(min(x), max(x), length.out = input$bins + 1)
  })
  
  output$figure <- renderPlot({
    x <- faithful$waiting 
    hist(
      x, breaks = bins(), col = "#75AADB", border = "white",
      xlab = "Waiting time to next eruption (in mins)",
      main = "Histogram of waiting times"
    )
    
    lapply(setdiff(allinputIds(), "go"), shinyjs::enable)
  })
}

ui <- tagList(
  shinyjs::useShinyjs(), 
  navbarPage(title="Test 2",
                    tabPanel(title="Old Faithful",
                             sidebarLayout(
                               sidebarPanel(
                                 sliderInput(
                                   inputId = "bins",
                                   label = "Number of bins:",
                                   min = 1,
                                   max = 50,
                                   value = 30
                                 )
                               ),
                               mainPanel(
                                 actionButton("go", "Update"),
                                 shinycssloaders::withSpinner(plotOutput(outputId="figure")),
                                 h4(textOutput("msg"))
                               )
                             )
                    )
  )
)

shinyApp(ui, server)