2016-11-08 3 views
0

Я разрабатываю карту буклетов в R блестящем. В этом приложении я хочу, чтобы фокус карты изменялся всякий раз, когда изменяется lng и lat значение в setView(). lng и lat значения основаны на какой стране, которую я выбираю из раскрывающегося списка. Раньше я использовал статическое значение для lng и lat в функции ifelse() и приложение работает. Но теперь проблема заключается в том, когда я хочу сделать вещи более универсальными: lng и lat будет означать долготу и широту из подмножества данных с выбранной страной, приложение больше не отображает карту (с моей точки зрения, расчет кажется правильным)Измените setView динамически в соответствии с полем выбора в приложении R shiny

Ниже приведен упрощенный и работоспособным R сценарий:

global.R:

library(devtools) 
library(leaflet) 
library(htmlwidgets) 
library(shiny) 
library(shinydashboard) 
library(sp) 
library(rworldmap) 
library(RCurl) 
library(ggmap) 

df <- read.csv(url("https://docs.google.com/spreadsheets/d/1rrEJiuxr4nafTqUQBlPpUdGwvGeGtBJExlPJdday2uw/pub?output=csv"), 
      header = T, 
      stringsAsFactors = F) 
df$Time <- as.Date(df$Time, "%d/%m/%Y") 

ui.R

header <- dashboardHeader(
    title = 'Shiny Memery' 
) 
body <- dashboardBody(
    fluidRow(
    tabBox(
     tabPanel("My Map", leafletOutput("mymap",height = 550)), 
     width = 700 
    )) 
) 
dashboardPage(
    header, 
    dashboardSidebar(
    sliderInput('Timeline Value','Time line',min = min(df$Time), 
       max = max(df$Time), 
       value = c(min(df$Time), min(df$Time)+10)), 
    selectInput("select_country", label = "Select Country", 
       choices = NULL, 
       selected = NULL) 
), 
    body 
) 

server.R

shinyServer(function(input, output, session) { 

    dfs <- reactive({ 
    tmp <- subset(df, df$Time <= input$`Timeline Value`[2] & df$Time >= input$`Timeline Value`[1]) 
    tmp 
    }) 

    part_choices <- reactive({ 
    as.list(c("All", unique(as.character(dfs()$Country)))) 
    }) 

    observe({ 
    updateSelectInput(session, "select_country", choices=part_choices()) 
    }) 

    output$mymap <- renderLeaflet({ 
    lng <- ifelse(input$select_country == "All", mean(dfs()$lon), 
        mean(subset(dfs(), Country %in% input$select_country)$lon) 
         ) 
    lat <- ifelse(input$select_country == "All", mean(dfs()$lat), 
        mean(subset(dfs(), Country %in% input$select_country)$lat) 
         ) 

    m <- leaflet(dfs()) %>% 
     addTiles(
    ) %>% 
     setView(lng, lat, zoom = 5) %>% 
     addMarkers(~lon, ~lat, 
       clusterOptions = markerClusterOptions()) 
    }) 
}) 

Вы увидите в server.R части я использую ifelse() изменить широчайшие значение по LNG и , которые в дальнейшем могут быть использованы в setView() функции. После того как я изменил аргумент else в вычислении, приложение больше не работает.

Действительно оцените, если кто-то скажет мне, где я был неправ.

Заранее спасибо.

ответ

1

В вашем ui.R, попробуйте изменить свой вклад страны в

selectInput("select_country", label = "Select Country", 
      choices = "All", 
      selected = "All") 

Я думаю, что ifelse s не возвращают число, учитывая, что input$select_country инициализируется при NULL, который (по причинам, которые неясны me) заставляет не запускать renderLeaflet и updateSelectInput, предотвращая обновление селектора страны.

+0

Привет Вонг, очень ценю за вашу помощь. Он работает сейчас. Я смотрел только на серверную часть и не понимал, что это простое изменение в ui.R может решить проблему, над которой я работаю довольно долго. Большое спасибо. – Lambo

 Смежные вопросы

  • Нет связанных вопросов^_^