我有一个由5列组成的数据库:client_name
,client id
,city
,latitude
和longitude
。
我想创建一个闪亮的应用程序,用户可以通过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')
)
)
)))
感谢您的帮助!
答案 0 :(得分:0)
您的问题是,您永远不会返回并访问更新后的LAT
和LONG
值。有两个问题:
首先,你只能从一个函数中返回一个东西。在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
函数永远不会运行,即使它已经运行,它也会 NOT 更改全局变量LAT
和LONG
的值。使用reactive
表达式的方法是在需要访问其值时调用它们。
在这种情况下,当您想要获取LAT
和LONG
的值时,可以调用subset_data
函数,然后检查它所依赖的输入是否已更改并返回其值。由于该值是命名向量,因此您可以使用双括号表示[[]]
:
output$mymap <- renderLeaflet({
leaflet() %>%
addTiles() %>%
addMarkers(lng=subset_data()[['LONG']], lat=subset_data()[['LAT']], popup="XXXX")
})