2017-08-15 1 views
1

" wirksam. Drücken Sie die Taste "Test Bins", damit die Funktion "observeEvent" nach der Aktualisierung des Schiebereglers 30 und dann 25 und 35 ausgibt die updateSliderInputs. Aus irgendeinem Grund scheint der Parameter "observeEvent" die Änderung der Schiebereglereingabe nicht zu verarbeiten.Die Funktion zum Aktualisieren des Eingangs wird erst nach dem Ereignis "

ui.R:

library(shiny) 
shinyUI(fluidPage(
    titlePanel("Old Faithful Geyser Data"), 
    sidebarLayout(
    sidebarPanel(
     sliderInput("bins", 
        "Number of bins:", 
        min = 1, 
        max = 50, 
        value = 30), 
     actionButton("test","Test Bins") 
    ), 
    mainPanel(
     plotOutput("distPlot") 
    ) 
) 
)) 

server.R:

library(shiny) 
shinyServer(function(input, output, session) { 
    output$distPlot <- renderPlot({ 
    x <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1) 
    hist(x, breaks = bins, col = 'darkgray', border = 'white') 
    }) 
    observeEvent(input$test,{ 
    print(input$bins) 
    updateSliderInput(session,"bins",value=25) 
    print(input$bins) 
    updateSliderInput(session,"bins",value=35) 
    print(input$bins) 
    }) 
}) 
+0

'input $ bins' ist im aktuellen 'observeEvent()' nicht reaktiv. Ein separates "observeEvent" auf "input $ bins" wird die Werte vor und nach dem Drücken der Schaltfläche ausgeben. Macht Sinn?? – Sagar

Antwort

0

Die Änderung nicht wirksam werden, bis die observeEvent Funktion endet. Wenn Sie den neuen Wert des Schiebereglers innerhalb des Beobachters verwenden müssen, können Sie eine zusätzliche Variable verwenden.

Im folgenden Beispiel wurde Ihr Code so geändert, dass der Schieberegler (und die zugehörige Variable input$bins) aktualisiert wird, bis die observeEvent Funktionen enden.

library(shiny) 

ui <- shinyUI(fluidPage(
    titlePanel("Old Faithful Geyser Data"), 
    sidebarLayout(
    sidebarPanel(
     sliderInput("bins", 
        "Number of bins:", 
        min = 1, 
        max = 50, 
        value = 30), 
     actionButton("test","Test Bins") 
    ), 
    mainPanel(
     plotOutput("distPlot") 
    ) 
) 
)) 

server <- function(input, output, session){  
output$distPlot <- renderPlot({ 
    x <- faithful[, 2] 
    bins <- seq(min(x), max(x), length.out = input$bins + 1) 
    hist(x, breaks = bins, col = 'darkgray', border = 'white') 
    }) 
    observeEvent(input$test,{ 
    print(input$bins) 
    value <- 25 
    updateSliderInput(session,"bins",value=value) 
    cat("Slider updated to:", value, "\n") 
    # simulate some complex process 
    Sys.sleep(1) 
    cat("Observer ends\n") 
    }) 
    observeEvent(input$bins, { 
    cat("Slider changed to:", print(input$bins), "\n") 
    }) 
} 

shinyApp(ui, server) 
+0

Dies funktioniert für ein einzelnes Update, aber was ist, wenn ich im observeEvent mehrere Update-Aufrufe habe und nach jedem einzelnen drucken muss? – jpd527

+0

Nur das letzte Update funktioniert. Die Aktualisierungsfunktion markiert nur den Schieberegler, um einen neuen Wert zu verwenden, aber Shiny modifiziert den Schieberegler, bis der Beobachter endet. Sie können mehrere Beobachter verwenden. Wenn Sie Änderungen am Schieberegler anzeigen möchten, können Sie JavaScript verwenden. – Geovany

Verwandte Themen