我使用Shiny app for DBSCAN,我有很多sliderInput,让用户选择
但是由于数据量很大,DBSCAN会等几分钟
不知道如何避免重复计算?
我试过使用isolate,它似乎没有执行
计划说明
用户在UI中选择sliderInput的eps和minpts并按下计算
服务器将执行
db <- isolate (dbscan (dtdb, eps = input $ dbeps, minPts = input $ dbminpts))
因为dbscan等了一会儿,我希望结果出来
用户在UI中调整slider1
和sliderInput
点,不会重新计算dbscan
相反,重新计算地图并显示ggmap (map) + point
除非dbscan eps
和minpts
已更改,并且按下按钮
但现在无论如何,都将实施
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
})
答案 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%有效,但它可以让你对如何构建你的代码有所了解。
希望这有帮助!