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)
あなたは何を意味するのかよく分かりません。私が見る限り、ボタンは問題ではありません。問題は、オーバーレイレイヤーがまだ読み込まれていても、オーバーレイレイヤーが表示されなくなることです。 上記のコードではtoggleState機能は実装されていませんが、条件に基づいて使用でき、ベースレイヤーのlayerIdを確認できます。 オーバーレイレイヤーを表示したままにする必要があります。 –
ボタンをクリックすると、inputId = 'btn_bgr_nh3'の値が変わります。ボタンがクリックされていない場合、値はデフォルトの0になります。 –
inputIdの値が 'overlay'グループのnh3_2014レイヤーの可視性にどのように関連しているかを詳しく説明できますか? –