Сбой блестящей страницы с глобальными переменными

#r #shiny #leaflet #global-variables

#r #блестящая #брошюра #глобальные переменные

Вопрос:

У меня есть несколько больших шейп-файлов, для которых я хочу выполнить некоторый анализ пересечения с использованием пользовательского ввода на карте листовки. На моей блестящей странице отображается карта, на которой пользователь может нарисовать полигон, и я хочу посмотреть, пересекает ли этот полигон любой из двух шейп-файлов. Я создал рабочую версию этого, в которой сервер считывает шейп-файлы каждый раз, когда пользователь подключается к серверу, но, очевидно, это не очень удобно для пользователя. Итак, я пытался переместить чтение шейп-файла в глобальные переменные, которые сервер загружает один раз, и пользователю просто нужно запустить intersect. Я пока пропущу публикацию своих 3 строк пользовательского интерфейса, но это приложение работает локально, только когда я запускаю его на выделенном сервере Shiny, который выходит из строя после того, как пользователь «закрывает» полигон. У меня такое чувство, что это проблема с объявлениями глобальных переменных, но файл журнала не генерируется, поэтому мне очень сложно его отлаживать.

App.R

 library(shiny)

source("/ui.R")
source("/server.R")

shpfile1 <- st_read("path_to_shpfile1")
shpfile2 <- st_read("path_to_shpfile2")

ui <- ui()
server <- server()

shinyApp(ui = ui, server = server)
 

Server.R

 # a number of libraries

server <- function(input, output, session) {
    output$s1 <- renderText({"Define project area..."})
    output$s2 <- renderText({"Define project area..."})

    print("Reading New Jersey boundary...")
    mapStates = map("state", "New Jersey", fill = FALSE, plot = FALSE)
    
    output$map <- renderLeaflet({
        leaflet(data = mapStates) %>% addTiles() %>% addPolygons(fillColor = topo.colors(10, alpha=0.8), stroke=FALSE) %>%
        addDrawToolbar(targetGroup = "projectArea", 
                       rectangleOptions = F, 
                       polylineOptions = F, 
                       markerOptions = F, 
                       circleMarkerOptions = F,
                       editOptions = editToolbarOptions(edit = FALSE, remove = TRUE, selectedPathOptions = selectedPathOptions()), 
                       circleOptions = F)
    })
    
    observeEvent(input$drawPoints, {
        proxy %>% clearShapes()
        for (i in seq_along(data)) {
            proxy %>% addPolygons(
                data[[i]][,"lon"],
                data[[i]][,"lat"],
                layerId=i,
                opacity=0.4,
                color = c('red','green')[i]
            )
            Sys.sleep(2)  # - this is to see first (red) polygon
        }
    })
    
    observeEvent(input$map_draw_new_feature, {
        withProgress(message = "Please wait...", value = 0, {
            # capture project area and convert to usable format for intersecting
            feat <- input$map_draw_new_feature
            coords <- unlist(feat$geometry$coordinates)
            coords <- matrix(coords, ncol=2, byrow=TRUE)
            poly <- st_sf(st_sfc(st_polygon(list(coords))), crs = " proj=longlat  datum=WGS84")
            
            # intersect project area with constraint layers
            incProgress(1/3, detail = "Analyzing shapefile1...")
            i_shp1 <- st_intersects(poly, shpfile1)
            c_shp1 <- sapply(i_shp1, length)
            incProgress(2/3, detail = "Analyzing shapefile2...")
            i_shp2 <- st_intersects(poly, shpfile2)
            c_shp2 <- sapply(i_shp2, length)
            
            if(c_streams > 0) {
                output$s1 <- renderText({"does intersect shapefile 1"})
            } else {
                output$s1 <- renderText({"does not intersect shapefile 1"})
            }
    
            if(c_wetlands > 0) {
                output$s2 <- renderText({"does intersect shapefile 2"})
            } else {
                output$s2 <- renderText({"does not intersect shapefile 2"})
            }
        })
    })

    
}

 

Комментарии:

1. вы можете использовать preserve_logs true; в своем файле shiny-server.conf для сохранения журналов приложений, чтобы просмотреть сообщения об ошибках. docs.rstudio.com/shiny-server/#application-error-logs

2. @cory спасибо, я посмотрю, смогу ли я получить к этому доступ. Я работаю в инженерной фирме, и они могут быть довольно придирчивыми к разрешениям: (

3. Возможно, вы можете запустить docker локально, чтобы протестировать блестящие приложения в серверной среде.