我正在尝试创建一个应用,允许用户点击地图,按go,然后接收该点的值表。我有2个netCDF文件存储在Dropbox上,我访问并保存为rasterStacks以获取输出数据。
在我的服务器函数中,我有一个用于地图点击的观察事件,但是当我稍后在服务器函数中使用纬度或经度的值时,我得到错误“找不到函数”clng“,其中clng为我将点击$经度保存到。
非常感谢任何帮助。
谢谢, 卡比
library(shiny)
library(leaflet)
library(raster)
library(tidyverse)
library(DT)
library(mailR)
# Read NetCDF Files from public share links
if(!exists("ettemp")){
ettemp <- tempfile("et", fileext = ".nc")
}
if(!exists("preciptemp")){
preciptemp <- tempfile("precip", fileext = ".nc")
}
if(!file.exists(ettemp)){
download.file(url = "https://www.dropbox.com/s/uyq9arqgnprxzv1/ET.nc?raw=1",
destfile = ettemp,
mode = "wb")
}
if(!file.exists(preciptemp)){
download.file(url = "https://www.dropbox.com/s/sgmhq8cmth1jd8h/precip.nc?raw=1",
destfile = preciptemp,
mode = "wb")
}
precip_lowres <- stack(preciptemp)
names(precip_lowres) <- month.name
ET_stack <- stack(ettemp)
names(ET_stack) <- month.name
ui <- fluidPage(
leafletOutput("map"),
actionButton("go", "Go"),
DT::dataTableOutput(outputId = "mytable")
)
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet({
leaflet() %>%
setView(lat = 35, lng = -100, zoom = 3) %>%
addTiles(options = providerTileOptions(noWrap = TRUE))
})
observeEvent(input$map_click, {
click <- input$map_click
clat <- click$lat
clng <- click$lng
leafletProxy('map') %>%
clearMarkers() %>%
addMarkers(lng=clng, lat=clat,
popup = paste(round(click$lat, 2), round(click$lng, 2)))
})
coordvals <- eventReactive(input$go, {
coords <- data.frame(cbind(clng(), clat()))
coordinates(coords) <- ~ X1 + X2
precip_vals <- data.frame(raster::extract(precip_lowres, coords)) %>%
gather(key = "Month", value = "Precip") %>%
mutate(Precip = round(Precip, 0))
ET_vals <- data.frame(raster::extract(ET_stack, coords)) %>%
gather(key = "Month", value = "ET")
combo_vals <- precip_vals %>%
left_join(ET_vals) %>%
mutate(ET = ET*3)
combo_vals$Month <- factor(combo_vals$Month, levels = month.name)
})
output$mytable <- DT::renderDataTable({
datatable(coordvals())
})
})
shinyApp(ui, server)
答案 0 :(得分:0)
下面我使用reactiveValues()
初始化click
,clat
和clng
。可以更清晰地将它们定义为单独的reactive()
表达式。无论哪种方式,如果你想在observeEvent(handlerExpr={})
参数之外使用它们,你应该在observeEvent()
之外定义它们。使用handlerExpr
更新其值。
library(shiny)
library(leaflet)
library(raster)
library(tidyverse)
library(DT)
library(mailR)
# Read NetCDF Files from public share links
if(!exists("ettemp")){
ettemp <- tempfile("et", fileext = ".nc")
}
if(!exists("preciptemp")){
preciptemp <- tempfile("precip", fileext = ".nc")
}
if(!file.exists(ettemp)){
download.file(url = "https://www.dropbox.com/s/uyq9arqgnprxzv1/ET.nc?raw=1",
destfile = ettemp,
mode = "wb")
}
if(!file.exists(preciptemp)){
download.file(url = "https://www.dropbox.com/s/sgmhq8cmth1jd8h/precip.nc?raw=1",
destfile = preciptemp,
mode = "wb")
}
precip_lowres <- stack(preciptemp)
names(precip_lowres) <- month.name
ET_stack <- stack(ettemp)
names(ET_stack) <- month.name
ui <- fluidPage(
leafletOutput("map"),
actionButton("go", "Go"),
DT::dataTableOutput(outputId = "mytable")
)
server <- shinyServer(function(input, output, session) {
output$map <- renderLeaflet({
leaflet() %>%
setView(lat = 35, lng = -100, zoom = 3) %>%
addTiles(options = providerTileOptions(noWrap = TRUE))
})
clickValues <- reactiveValues(
click=NULL, clat=NULL, clng=NULL)
observeEvent(input$map_click, {
clickValues$click <- input$map_click
clickValues$clat <- click$lat
clickValues$clng <- click$lng
leafletProxy('map') %>%
clearMarkers() %>%
addMarkers(lng=clickValues$clng, lat=clickValues$clat,
popup = paste(round(clickValues$click$lat, 2),
round(clickValues$click$lng, 2)))
})
coordvals <- eventReactive(input$go, {
coords <- data.frame(cbind(clickValues$clng, clickValues$clat))
coordinates(coords) <- ~ X1 + X2
precip_vals <- data.frame(raster::extract(precip_lowres, coords)) %>%
gather(key = "Month", value = "Precip") %>%
mutate(Precip = round(Precip, 0))
ET_vals <- data.frame(raster::extract(ET_stack, coords)) %>%
gather(key = "Month", value = "ET")
combo_vals <- precip_vals %>%
left_join(ET_vals) %>%
mutate(ET = ET*3)
combo_vals$Month <- factor(combo_vals$Month, levels = month.name)
})
output$mytable <- DT::renderDataTable({
datatable(coordvals())
})
})
shinyApp(ui, server)