首页 > 解决方案 > 通过文本输入(客户名称),我如何访问数据库并通过传单/闪亮/R(弹出)呈现他的所有信息

问题描述

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

我想创建一个闪亮的应用程序,用户可以在其中选择一个客户id,然后看到一个带有标记的地图,显示客户的位置并弹出他们的主要信息

下面的代码让用户选择一个客户端并显示一个地图,但地图总是出现在默认纬度和经度(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')
            )
        )
)))

谢谢您的帮助 !

标签: inputshinyleafletreactive

解决方案


您的问题是您永远不会返回并访问您更新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)))
})

其次,您没有正确访问您的反应式表达。LAT并且LONG是一开始就设置的,永远不会改变。该subset_data函数永远不会运行,即使它运行过,它也不会更改全局变量LATLONG. 使用reactive表达式的方式是在需要访问它们的值时调用它们。

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

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

推荐阅读