2016-07-19 14 views
0

Shiny Appのベースレイヤーをプログラム的に変更しようとしています。 私は 'リーフレット'のLayerControlを使いたくないので、1つのパネルにすべてのコントロールを入れたいと思っています。私はshinyjsを使用し、2つの基本レイヤーの間を行き来するボタンをtoggleStateと一緒に使うことに決めました。Rのリーフレットのベースレイヤーをオーバーレイを失うことなく変更する

現時点では、基本レイヤーを変更する原則を理解する段階にあり、最初に読み込まれた基本レイヤーのタイルを削除する必要があるように、1つの基本レイヤーしか表示されないようです。

これで、表示時にベースレイヤーを変更できますが、同時にベースレイヤーが変更されました。オーバーレイが失われています。どうすればそれを避けることができますか?

ボタンをもう一度使用すると、オーバーレイがまだ存在しますが、基本レイヤの上には表示されないことがちらちらでわかります。ここで

例:私はあなたが何ができるかと思います

library(shiny) 
library(leaflet) 
library(shinydashboard) 

# Definition of Sidebar elements 
sidebar <- dashboardSidebar(
    sidebarMenu(
    menuItem("Maps", tabName = "maps", icon = icon("globe"), 
     menuSubItem(
     HTML(paste("Diffuse kilder NH", tags$sub("3"), sep = "")), 
     tabName = "map_dif_nh3", icon = icon("map-o"), selected = TRUE 
    ) 
    ) 
) 
) 

# Definition of body elements 
body <- dashboardBody(
    tabItems(
    tabItem(tabName = "map_dif_nh3", 
     box(
     width = 12, 
     div(style = "height: calc(100vh - 80px);", 
      leafletOutput(
      "m_dif_nh3", width = "100%", height = "100%" 
     ), 
      absolutePanel(id = "nh3_panel", class = "panel panel-default", 
      fixed = TRUE, style = "opacity: 0.87", 
      top = 80, left = "auto", right = 50, bottom = "auto", 
      width = 285, height = "auto", 
      fluidRow(
       column(width = 10, offset = 1, 
       actionButton(inputId = 'btn_bgr_nh3', label = "", icon = icon("globe", class = "fa-lg")) 
      ) 
      ) 
     ) 
     ) 
    ) 
    ) 
) 
) 

ui <- dashboardPage(
    dashboardHeader(title = "Mixed layout"), 
    sidebar, 
    body 
) 


server <- function(input, output) { 

    init_lat <- 56.085935208960585 
    init_lon <- 10.29481415546154 
    init_zoom <- 7 

    output$m_dif_nh3 <- renderLeaflet({ 
    leaflet(height = "100%") %>% 
    addProviderTiles("Stamen.Toner", layerId = 'mb_osm', group = "base") %>% 
    setView(init_lon, init_lat, init_zoom) %>% 
    addWMSTiles(
     "http://gis.au.dk/geoserver_test/PRTR/gwc/service/wms", 
     layers = "PRTR:prtr_nh3_2014", 
     layerId = "nh3_2014", 
     group = "overlay", 
     options = WMSTileOptions(format = "image/png", 
     transparent = TRUE, opacity = 0.8 
    ) 
    ) 
    }) 

    observeEvent(
    input$btn_bgr_nh3, { 
     leafletProxy("m_dif_nh3") %>% 
     addProviderTiles("Esri.WorldImagery", layerId = 'mb_pic', group = 'base') 
     leafletProxy("m_dif_nh3") %>% 
     removeTiles(layerId = 'mb_osm') 
    } 
) 
} 

shinyApp(ui, server) 

答えて

0

は、ボタンをクリックした後に0にIDアクションボタンの値をリセットです。したがって、ID値を切り替えるたびに0に置き換えられます。それは私のために働いた。それもあなたのために働くことを望みます。

+0

あなたは何を意味するのかよく分かりません。私が見る限り、ボタンは問題ではありません。問題は、オーバーレイレイヤーがまだ読み込まれていても、オーバーレイレイヤーが表示されなくなることです。 上記のコードではtoggleState機能は実装されていませんが、条件に基づいて使用でき、ベースレイヤーのlayerIdを確認できます。 オーバーレイレイヤーを表示したままにする必要があります。 –

+0

ボタンをクリックすると、inputId = 'btn_bgr_nh3'の値が変わります。ボタンがクリックされていない場合、値はデフォルトの0になります。 –

+0

inputIdの値が 'overlay'グループのnh3_2014レイヤーの可視性にどのように関連しているかを詳しく説明できますか? –

関連する問題