在后面的代码

时间:2017-10-22 22:49:19

标签: r shiny shiny-server

我正在尝试创建一个应用,允许用户点击地图,按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)

1 个答案:

答案 0 :(得分:0)

下面我使用reactiveValues()初始化clickclatclng。可以更清晰地将它们定义为单独的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)