使用文本输入(客户端名称),如何通过传单/闪亮/ R(弹出)访问数据库并显示所有信息

时间:2018-06-14 08:41:05

标签: input shiny leaflet reactive

我有一个由5列组成的数据库:client_nameclient idcitylatitudelongitude

我想创建一个闪亮的应用程序,用户可以通过id选择一个客户端,然后查看带有标记的地图,显示客户的位置并弹出主要信息< / p>

以下代码允许用户选择客户端并显示地图,但地图始终显示时标记位于默认的纬度和经度(45和3)。

library(shiny)
library(leaflet)
library(shinythemes)

ee <- read.csv(file="C:\\Shiny\\data\\comptes.csv",header=TRUE, sep=";", encoding="UTF-8")
LAT=45
LONG=3

shinyServer(function(input,output,session){

    subset_data = reactive({
        LAT= head(subset(ee,ee$client_id==input$client,  select=c(Lat)),1)
        LONG= head(subset(ee,ee$client_id==input$client, select=c(Long)),1)
        return (LAT)
        return (LONG)
    })

    #Carte vue d'ensemble
    outpu$mymap=renderLeaflet({
        leaflet() %>%
        addTiles() %>% 
        addMarkers(lng=LONG, lat=LAT, popup="XXXX")
    })
})

shinyUI(navbarPage("Title",
    theme = shinytheme("united"),
    tabPanel("Vue d'ensemble",
        sidebarLayout(
            sidebarPanel(
                textInput("client","Votre id client")
            ),
            mainPanel(
                width=8,
                leafletOutput('mymap')
            )
        )
)))

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

您的问题是,您永远不会返回并访问更新后的LATLONG值。有两个问题:

首先,你只能从一个函数中返回一个东西。在subset_data函数中,当代码到达return(LAT)时,它会返回该值,但永远不会达到return(LONG)。如果要从一个函数返回2个值,则应将它们放入列表或向量中并返回:

subset_data = reactive({
    LAT= head(subset(ee,ee$client_id==input$client,  select=c(Lat)),1)
    LONG= head(subset(ee,ee$client_id==input$client, select=c(Long)),1)
    return(c('LAT' = LAT, 'LONG' = LONG)))
})

其次,您没有正确访问您的反应表达式。 LATLONG在开头设置,从不更改。 subset_data函数永远不会运行,即使它已经运行,它也会 NOT 更改全局变量LATLONG的值。使用reactive表达式的方法是在需要访问其值时调用它们。

在这种情况下,当您想要获取LATLONG的值时,可以调用subset_data函数,然后检查它所依赖的输入是否已更改并返回其值。由于该值是命名向量,因此您可以使用双括号表示[[]]

来访问所需的值
output$mymap <- renderLeaflet({
    leaflet() %>%
        addTiles() %>% 
        addMarkers(lng=subset_data()[['LONG']], lat=subset_data()[['LAT']], popup="XXXX")
})