R Shiny:当行顺序发生变化时,如何根据选定的行选择DataTable页面?

时间:2017-04-28 12:05:27

标签: r shiny

我想基于点击传单地图上的标记突出显示Shiny应用中的一行数据表。为此,我必须更改页面,如果选择了第46行,则转到第5页。

如果我不更改行顺序,它可以正常工作。

enter image description here

如果我对行重新排序(例如在升序val上),我找不到转到与所选行对应的页面的方法。

我有ckecked the dataTableProxy manual,但没有帮助。

非常感谢任何帮助。

您可以运行的代码示例:

ui.R

library(shiny)
library(leaflet)
library(DT)

shinyUI(fluidPage(
  mainPanel(
    leafletOutput("Map"),
    dataTableOutput("Table")
  )
))

server.R

library(shiny)
library(leaflet)
library(DT)

shinyServer(function(input, output) {

  nbpts <- 50
  center <- c(47,3)
  ref <- 1:nbpts
  lat <- rnorm(nbpts, center[1], 2)
  lng <- rnorm(nbpts, center[2], 2)
  val <- sin(lat+lng)

  data <- data.frame(ref, lat, lng,val)

  output$Table <- renderDataTable({
    DT::datatable(data, selection = "single")
  })

  TableProxy <-  dataTableProxy("Table")

  output$Map <- renderLeaflet({
    data_map <- leaflet(data) %>%
      addTiles() %>%
      addCircleMarkers(
        lng=~lng,
        lat=~lat,
        layerId = ~ref,
        radius = 4,
        color = "purple",
        stroke = FALSE,
        fillOpacity = 0.5
      )
    data_map
  })

  observeEvent(input$Map_marker_click, {
    clickId <- input$Map_marker_click$id
    dataId <- which(data$ref == clickId)
    TableProxy %>%
      selectRows(dataId) %>%
      selectPage(dataId %/% 10 + 1)
  })
})

1 个答案:

答案 0 :(得分:6)

对于行,您应该过滤ref数字和页码,您应该借助实际行号来计算。

这可以帮到你:

  observeEvent(input$Map_marker_click, {
      clickId <- input$Map_marker_click$id
      dataTableProxy("Table") %>%
      selectRows(which(data$ref == clickId)) %>%
      selectPage(which(input$Table_rows_all == clickId) %/% 10 + 1)
  })

Upvote,因为这个问题非常有趣。

修改 有关动态表长度变量的提示,请致电NicE,请参阅注释。

   output$Table <- renderDataTable({
       DT::datatable(data, selection = "single",options=list(stateSave = TRUE))
   })

   observeEvent(input$Map_marker_click, {
      clickId <- input$Map_marker_click$id
      dataTableProxy("Table") %>%
      selectRows(which(data$ref == clickId)) %>%
      selectPage(which(input$Table_rows_all == clickId) %/% input$Table_state$length + 1)
  })