2017-08-15 8 views
1

"Test Bins"ボタンを押すと、observeEvent関数は30を印刷し、スライダが更新された後は25と35が印刷されます。 updateSliderInputのです。何らかの理由でobserveEventコードがスライダ入力の変更を処理していないようです。更新入力機能がobserveEventの後まで有効にならない

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:observeEvent関数が終了するまで変更は有効になりません

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

'入力$ binsは現在の' observeEvent() 'では反応しません。 'input $ bins'の別の' observeEvent'は、ボタンを押す前後に値を出力します。意味がある? – Sagar

答えて

0

。オブザーバ内でスライダの新しい値を使用する必要がある場合は、余分な変数を使用できます。

以下の例では、observeEvent関数が終了するまで、スライダー(および関連するinput$bins変数)の更新方法を示すコードが変更されています。

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

これは単一のアップデートで動作しますが、observeEventで複数の更新呼び出しがあり、それぞれの後に印刷する必要がある場合はどうすればよいですか? – jpd527

+0

最後の更新のみが動作します。更新機能は新しい値を使用するようにスライダをマークするだけですが、Shinyはオブザーバが終了するまでスライダを修正します。複数のオブザーバーを使うことができます。スライダへの変更を表示したい場合は、JavaScriptを使用できます。 – Geovany

関連する問題