2017-08-01 52 views
0

我正在構建一個Shiny應用程序,我希望使用dyRangeSelectordygraphs提供輸入週期。更改dygraph的dyRangeSelector閃爍的反應時間

我的問題是,當選擇器收到一個「MouseUp」事件,即用戶完成選擇期間時,我只想要觸發反應性更改。現在,隨着選擇器的移動,事件被分派,這導致滯後的應用程序,因爲每個週期完成的計算需要幾秒鐘。本質上,Shiny也是對我的品味起反應(我知道這是錯誤的方式 - 通常我們希望應用程序是超級反應)。

我可以修改何時發送被動請求嗎?

下面是一個顯示問題的小例子。

library(quantmod) 
library(shiny) 
library(dygraphs) 
library(magrittr) 

# Create simple user interface 
ui <- shinyUI(fluidPage(

    sidebarLayout(
    sidebarPanel(
      dygraphOutput("dygraph") 
      ),  
    mainPanel(
      plotOutput("complicatedPlot") 
      ) 
    ) 
)) 

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

    ## Read the data once.                      
    dataInput <- reactive({ 
    getSymbols("NASDAQ:GOOG", src = "google", 
        from = "2017-01-01", 
        auto.assign = FALSE) 
    }) 

    ## Extract the from and to from the selector  
    values <- reactiveValues()  

    observe({ 
     if (!is.null(input$dygraph_date_window)) { 
      rangewindow <- strftime(input$dygraph_date_window[[1]], "%Y-%m-%d") 
      from <- rangewindow[1] 
      to <- rangewindow[2] 
     } else { 
      from <- "2017-02-01" 
      to <- Sys.Date()+1 
     } 
     values[["from"]] <- from 
     values[["to"]] <- to 
    }) 

    ## Render the range selector  
    output$dygraph <- renderDygraph({ 
     dygraph(dataInput()[,4]) %>% dyRangeSelector() %>% dyOptions(retainDateWindow = TRUE) 
    }) 

    ## Render the "complicated" plot 
    output$complicatedPlot <- renderPlot({ 
     plot(1,1) 
     text(1,1, values[["from"]]) 
     Sys.sleep(1) ## Inserted to represent computing time 
    }) 
}) 

## run app                                                       
runApp(list(ui=ui, server=server)) 

回答

3

有光澤的功能稱爲debounce這可能幾乎適合您的需求。如果您將極限重寫爲反應式表達式(與觀察結果相反),則可以將其包裝到debounce中,然後以毫秒爲單位指定要在評估之前等待的時間。這裏是1000毫秒的例子:

library(quantmod) 
library(shiny) 
library(dygraphs) 
library(magrittr) 

# Create simple user interface 
ui <- shinyUI(fluidPage(

    sidebarLayout(
    sidebarPanel(
     dygraphOutput("dygraph") 
    ),  
    mainPanel(
     plotOutput("complicatedPlot") 
    ) 
) 
)) 

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

    ## Read the data once.                      
    dataInput <- reactive({ 
    getSymbols("NASDAQ:GOOG", src = "google", 
       from = "2017-01-01", 
       auto.assign = FALSE) 
    }) 

    ## Extract the from and to from the selector  
    values <- reactiveValues()  

    limits <- debounce(reactive({ 
    if (!is.null(input$dygraph_date_window)) { 
     rangewindow <- strftime(input$dygraph_date_window[[1]], "%Y-%m-%d") 
     from <- rangewindow[1] 
     to <- rangewindow[2] 
    } else { 
     from <- "2017-02-01" 
     to <- Sys.Date()+1 
    } 
    list(from = from, 
     to = to) 
    }), 1000) 

    ## Render the range selector  
    output$dygraph <- renderDygraph({ 
    dygraph(dataInput()[,4]) %>% dyRangeSelector() %>% dyOptions(retainDateWindow = TRUE) 
    }) 

    ## Render the "complicated" plot 
    output$complicatedPlot <- renderPlot({ 
    plot(1,1) 
    text(1,1, limits()[["from"]]) 
    Sys.sleep(1) ## Inserted to represent computing time 
    }) 
}) 

## run app                                                       
runApp(list(ui=ui, server=server)) 

這基本上意味着,所述反應性表達式必須爲至少1秒來返回相同的值被髮送到其相關性。你可以嘗試一下最好的時間。

+0

太好了。那正是我所追求的。它「耗費」了我在啓動時的等待時間,但那完全沒問題。乾杯! – ekstroem