updatetabsetPanel из всплывающей ссылки листовки в R Shiny - PullRequest
0 голосов
/ 12 января 2020

Борется с R блестящим новичком здесь. Мне трудно понять, как переключать вкладки на боковой панели с двумя вкладками (люди | места), когда нажимается ссылка в метке на карте в главной панели. Я беру это из рассмотрения других, несколько похожих вопросов, что updatetabsetPanel - это путь к go. Я попробовал следующее, и он прекрасно работает, обновляя iframe, когда вкладка «места» активна, но не выводит вкладку «места» вперед, когда вкладка «люди» активна. Мне в основном неясно, как использовать здесь «href», чтобы вызвать событие, которое меняет вкладку.

ui

ui <- fluidPage(

  fluidRow(

  # ADDED SHINY JS
  useShinyjs(debug = TRUE),

    column(3,
           "DATA",


           tabsetPanel(id='lefttabsetPanel',

                       tabPanel(title='PLACES', value = "placestab",
                                tags$iframe(name="myiframe2",seamless="seamless",src="http://www.example.com/places.xml",height=600, width=320)
                       ), 
                       tabPanel(title='PEOPLE', value = "peopletab",

                                tags$iframe(name="myiframe",seamless="seamless",src="http://www.example.com/people.xml",height=600, width=320))

    )
    ),
    column(9,
           "MAPS",


  tabsetPanel(id='my_tabsetPanel',
              tabPanel('Map 1',

 # ADDED LINKS TO TABS THAT WORK
 a(id="peopletablink","link to peopletab",href="http://45.56.98.26:8080/exist/rest/db/madrid/xml/tds-people.xml#PERSCELESTINA", target="myiframe"),
                       a(id="placestablink","link to placestab",href="http://45.56.98.26:8080/exist/rest/db/madrid/xml/tds-placeography.xml#PLACEMADRID", target="myiframe2"),

                       leafletOutput(outputId="mymap", height = 600)   
              ), 
              tabPanel('Map 2', 
                       leafletOutput(outputId="mymap2", height = 600)   
              )


              )

  )
)
  )
)

global

server <- function(input,output, session){

  data <- reactive({
    x <- placeography
  })
  # Core wrapping function
  wrap.it <- function(x, len)
  { 
    sapply(x, function(y) paste(strwrap(y, len), 
                                collapse = "\n"), 
           USE.NAMES = FALSE)
  }
# NEW SHINYJS 
    shinyjs::onclick("peopletablink",  updateTabsetPanel(session, inputId="lefttabsetPanel", selected="peopletab"))
    shinyjs::onclick("placestablink",  updateTabsetPanel(session, inputId="lefttabsetPanel", selected="placestab"))


# OLD APPROACH

 # observeEvent(input$place_link, {
 #   updateTabsetPanel(session, "lefttabsetPanel", 'placetab')
 # }
 # )
  output$mymap <- renderLeaflet({

    m <- leaflet() %>%
      setView(lng=-3.6898447, lat=40.4142174, zoom=3 ) %>%

      #MAP--SATELLITE ESRI

      addProviderTiles("Esri.WorldImagery", group="Satellite") %>%

      # PLACES
      addPolygons(data = tdscountries,
        popup = mapply(function(x, y) {

# THE POPUP LINK I WANT TO CHANGE THE TAB--BUT DOESN'T WORK
            HTML(sprintf("<div class='leaflet-popup-scrolled' style='font-size:10px;max-width:200px;max-height:150px; '><b><a href='http://www.example.com/places.xml#%s' target='myiframe2' id='placestablink'>%s</a><BR><BR>Click for more details</div>", w,htmlEscape(x), y))},
            tdscountries$placeref,tdscountries$placename, SIMPLIFY = F),
        popupOptions = lapply(1:nrow(tdscountries), function(x,y) {
          popupOptions(direction='auto')}),weight = 0.75,  group = "Countries", fillColor ="gold") 

          })}

Я вывожу свои данные tdscountries здесь:

http://45.56.98.26/tdscountries.txt

Извинения, если это слишком похоже на другие вопросы - я посмотрел их все (вместе с официальным Shiny документацию для updatetabsetPanel) и дал ему шанс, но я явно что-то упустил.

ОБНОВЛЕНИЕ: у меня почти получил это работает. Теперь я могу создавать ссылки, которые переключают вкладки и ссылки глубже в xml do c в iframe, используя блестящий js (как здесь предлагается: блестящий: изменение вкладки при нажатии на изображение ), но тот же самый a не работает в моих всплывающих ссылках на листовки, поэтому я все еще ищу решение этой проблемы. Я обновил информацию выше, если она пригодится кому-либо в будущем.

1 Ответ

0 голосов
/ 16 января 2020

Наконец-то понял это, и все оказалось намного проще, чем я думал, и не требует блестящей библиотеки js. Ответ был здесь и работает для ссылок во всплывающих окнах:

Попытка интегрировать updateTabsetPanel с маркером листовки в R Shiny?

Чтобы обновить код выше. Это работает:

пользовательский интерфейс

ui <- fluidPage(

  fluidRow(

    column(3,
           "DATA",


           tabsetPanel(id='lefttabsetPanel',

                       tabPanel(title='PLACES', value = "placestab",
                                tags$iframe(name="myiframe2",seamless="seamless",src="http://www.example.com/places.xml",height=600, width=320)
                       ), 
                       tabPanel(title='PEOPLE', value = "peopletab",

                                tags$iframe(name="myiframe",seamless="seamless",src="http://www.example.com/people.xml",height=600, width=320))

    )
    ),
    column(9,
           "MAPS",


  tabsetPanel(id='my_tabsetPanel',
              tabPanel('Map 1',


                       leafletOutput(outputId="mymap", height = 600)   
              ), 
              tabPanel('Map 2', 
                       leafletOutput(outputId="mymap2", height = 600)   
              )


              )

  )
)
  )
)

global

server <- function(input,output, session){

# detect link clicked in leaflet popup and switch tabs

observeEvent(input$linkclickplaces,{
    updateTabsetPanel(session, inputId="lefttabsetPanel", selected="placestab")

  })
  observeEvent(input$linkclickpeople,{
    updateTabsetPanel(session, inputId="lefttabsetPanel", selected="peopletab")

  })

  data <- reactive({
    x <- placeography
  })
  # Core wrapping function
  wrap.it <- function(x, len)
  { 
    sapply(x, function(y) paste(strwrap(y, len), 
                                collapse = "\n"), 
           USE.NAMES = FALSE)

output$mymap <- renderLeaflet({

    m <- leaflet() %>%
      setView(lng=-3.6898447, lat=40.4142174, zoom=3 ) %>%

      #MAP--SATELLITE ESRI

      addProviderTiles("Esri.WorldImagery", group="Satellite") %>%

      # PLACES
      addPolygons(data = tdscountries,
        popup = mapply(function(x, y) {

# THE LEAFLET POPUP LINK THAT CHANGES THE TAB
            HTML(sprintf("<div class='leaflet-popup-scrolled' style='font-size:10px;max-width:200px;max-height:150px; '><b><a href='http://www.example.com/places.xml#%s' target='myiframe2' onclick='Shiny.onInputChange(\"linkclickplaces\",  Math.random())'>%s</a><BR><BR>Click for more details</div>", w,htmlEscape(x), y))},
            tdscountries$placeref,tdscountries$placename, SIMPLIFY = F),
        popupOptions = lapply(1:nrow(tdscountries), function(x,y) {
          popupOptions(direction='auto')}),weight = 0.75,  group = "Countries", fillColor ="gold") 

          })}

В зависимости от того, как вы создаете всплывающую ссылку, вам нужно следить за использованием и выходом из одинарные и двойные кавычки.

Всего одна оговорка / точка соприкосновения - в моем случае ссылка во всплывающем окне листовки также обновляет iframe на вкладке «места» с помощью такой ссылки:

<a href='http://www.example.com/places.xml#PLACEREF' target='myiframe2' onclick='Shiny.onInputChange(\"linkclickplaces\",  Math.random())'>PLACE NAME</a>

При первом нажатии на ссылку, которая меняет вкладки, первый щелчок не обновляет фрейм, а второй -. (В зависимости от браузера первый щелчок приводит вас к верхней или нижней части внедренного документа xml.) Находясь на вкладке, одиночные щелчки позволяют перемещаться по ней. Я ищу решение этой проблемы, но пока помещаю всплывающие инструкции, чтобы дважды щелкнуть ссылки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...