выделите строку в зависимости от события пользователя, R / DT / Shiny, без использования подкачки - PullRequest
0 голосов
/ 25 сентября 2018

Я пытаюсь получить таблицу данных (DT) для прокрутки к нужной строке / строке при наведении курсора на точку на карте.Я могу сделать что-то, например, выбрать строку, но не могу понять, как сделать Y-прокрутку с датой для правильной записи.Я пытаюсь сделать это без подкачки страниц, так как моя таблица данных использует подмножества и в целом не так велика.

Я делаю это в R / Shiny / DT, мой опыт работы с javascript равен 0. Это сообщение, похоже, пытается сделать то же самое, за исключением того, что в качестве примера используется начальная загрузка таблицы вместо реакции насобытия за пределами изначально загруженной таблицы.Я не понимаю, как бы я сделал таблицы прокрутка реагировать на события пользователя.

R Shiny - Прокрутка до заданной строки данных с обратным вызовом JavaScript

Продукт предназначен для внутреннего (академического) использования для ускорения манипулирования данными и проверки ошибок.

#Attempt at datatable scrollable, workable example
library(shiny)
library(leaflet)
library(DT)

data("mtcars")
samp_data = cbind(mtcars,mtcars,mtcars)
samp_data[2] = 'just some string thats often quite long and will take multiple lines on a table draw, 
                one problem I have is that if I do add "scroller = T" to the options list in the renderDT call,
                is that this line will collapse into a single line and create a very long horizonal entry.'

ui = fillPage(

  fillRow( flex = 1, width = '100%', height = '80%',

           leafletOutput("map", width = '100%', height = "100%")

  ),


  fillRow( width = '100%', height='20%', flex = 1,
           # style = "overflow-y: auto; overflow-x: auto;",
           div( DTOutput('db_info', width="100%", height="100%"), style = "font-size:85%")
  )

)


server = shinyServer(function(input, output, session) {

  output$map = renderLeaflet( leaflet(options = leafletOptions(zoomControl = FALSE)) %>% addTiles() %>% addMiniMap(zoomLevelFixed=2, toggleDisplay=T) )
  # output$map = renderLeaflet( leaflet(options = leafletOptions(zoomControl = FALSE)) %>% addTiles() %>% addMiniMap(zoomLevelFixed=2, toggleDisplay=T) )

  #For some reason the first draw is wrong
  output$db_info <- renderDT( samp_data,
                              class = 'cell-border stripe',
                              # extensions = 'Scroller',
                              rownames = F,
                              server = F,
                              options = list(
                                dom = 't', # dom 't' is a specific option
                                autoWidth = T,
                                scrollX = T,
                                scrollY = '15vh',
                                scrollCollapse = T,
                                # scroller = T,
                                # paging = F,
                                # initComplete  = JS('function() {
                                #    $(this.api().table().row(4)).addClass("selected");
                                #                    this.api().table().row(4).scrollTo();}'),
                                columnDefs = list(list(
                                  width = '500px', targets = c(1) #sets width of citations, need autoWidth=T and scrollX=T to work
                                ))# END columnDefs
                              )# End options list
  )# END RENDER DATA TABLE

  #some event on map doesn't really matter for example, hardcode for now
  #observeEvent({
  #This is where I would like to scroll to the appropriate row in the datatable

  # dataTableProxy("db_info", session = session)
  # selectRows(c(4,6)) %>%
  # selectPage(which(input$db_info_rows_all == c(4,6)) %/% input$db_info_state$length + 1)

  # callback = JS('.scroller.toPosition( 4 );')
  # dataTableProxy('db_info', session=session) %>% selectRows(c(5,6)) 

  #})

})

shinyApp(ui, server)

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

Спасибо за любую помощь!

1 Ответ

0 голосов
/ 01 ноября 2018

Так как я не смог решить эту проблему, учитывая, что мне, видимо, мне нужно знать длину таблицы заранее, прежде чем я смогу прокручивать ее (и разбивать на страницы), мне пришлось согласиться на другой подход.

  observeEvent( input$map_marker_mouseover, {
    marker_id = input$map_marker_mouseover$id

    dataTableProxy("db_info", session = session) %>%
      updateSearch(keywords = list(global = marker_id , columns = "acc_num"))
  })

  observeEvent( input$map_marker_mouseout, {
    dataTableProxy("db_info", session = session) %>%
      clearSearch()
  })

Проще говоря, я делаю уникальный идентификатор таблицы в виде $ id маркера, когда я наводю курсор мыши на точку, она автоматически выполняет поиск в столбце уникального идентификатора, что приводит к тому, что для таблицы задается толькозапись.При отключении он очищает поиск, и таблица снова появляется.Я делаю таблицу с этими параметрами:

output$db_info <- renderDT( sp_pts,
                            class = 'cell-border table-condensed table-hover',
                            rownames = FALSE,
                            server = F,
                            options = list(
                              dom = 'tf',
                              autoWidth = T,
                              scrollX = T,
                              scrollY = '15vh',
                              scrollCollapse = T,
                              searching = T,
                              paging = F,
                              columnDefs = list(list(
                                  width = '500px', 
                                  targets = c(pt_cite_loc)
                                  ))# END columnDefs
                              )# End options list
  )# END RENDER DATA TABLE
...