闪亮的变量避免计算

时间:2018-01-17 14:29:03

标签: r shiny

我使用Shiny app for DBSCAN,我有很多sliderInput,让用户选择

但是由于数据量很大,DBSCAN会等几分钟

不知道如何避免重复计算?

我试过使用isolate,它似乎没有执行

计划说明

用户在UI中选择sliderInput的eps和minpts并按下计算

服务器将执行

db <- isolate (dbscan (dtdb, eps = input $ dbeps, minPts = input $ dbminpts))

因为dbscan等了一会儿,我希望结果出来

用户在UI中调整slider1sliderInput点,不会重新计算dbscan

相反,重新计算地图并显示ggmap (map) + point

除非dbscan epsminpts已更改,并且按下按钮

但现在无论如何,都将实施

db <- isolate (dbscan (dtdb, eps = input $ dbeps, minPts = input $ dbminpts))

但也要等几分钟才能得到结果,我不知道还能用什么?

ui <-label = "data",    
     sliderInput("eps", label="EPS",
     min = 0.01, max = 0.09, value = 0.01),

     sliderInput("minpts", label="MinPts",
     min = 10, max = 50, value = 10),

     actionButton("goButton", "Calculate"),

     sliderInput("slider1", label="MAP",
     min = 5, max = 20, value = 16),

     sliderInput("point", label="point",
     min = 0.5, max = 5.5, value = 3, step = 0.5)

server <-output$distPlot2 <- renderPlot({

    map <- get_map(location = c(lon = -74.0028885, lat = 40.7310282), zoom = input$slider1)

    if(input$goButton == 0){
      return(ggmap(map ))
    }

    input$goButton

    dtdb <- dt.All.data[,3:4]

    db <- isolate(dbscan(dtdb, eps=input$dbeps, minPts=input$dbminpts))

    point <- geom_point(data = dtdb,aes(x = Longitude, y = Latitude),col=db$cluster+1L,size = input$dbpoint)

    ggmap(map) + point 
  })

1 个答案:

答案 0 :(得分:0)

嗨,问题是你把所有的计算放在同一个反应上下文e.i. renderpolot。尝试制作反应性表达链。这样就可以更容易地控制重新计算的内容。我会尝试这样的事情

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

  map <- reactive({
    map <- get_map(location = c(lon = -74.0028885, lat = 40.7310282), zoom = input$slider1)
  })  

  points <- eventReactive(input$goButton,{
    dtdb <- dt.All.data[,3:4]

    db <- isolate(dbscan(dtdb, eps=input$dbeps, minPts=input$dbminpts))

    point <- geom_point(data = dtdb,aes(x = Longitude, y = Latitude),col=db$cluster+1L,size = input$dbpoint)
  })

  output$distPlot2 <- renderPlot({


    ggmap(map()) + 
      if(input$goButton == 0){
        points()
      }

  })

}

不,你没有提供任何测试数据,因此我没有测试代码,看它是否100%有效,但它可以让你对如何构建你的代码有所了解。

希望这有帮助!