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

vwr*_*bel 7 r shiny

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

如果我不更改行顺序,它工作正常.

在此输入图像描述

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

我已经删除了dataTableProxy手册,但它没有帮助.

任何帮助将非常感激.

您可以运行的代码示例:

ui.R

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

shinyUI(fluidPage(
  mainPanel(
    leafletOutput("Map"),
    dataTableOutput("Table")
  )
))
Run Code Online (Sandbox Code Playgroud)

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)
  })
})
Run Code Online (Sandbox Code Playgroud)

Big*_*ist 7

对于行,您应该过滤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)
  })
Run Code Online (Sandbox Code Playgroud)

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)
  })
Run Code Online (Sandbox Code Playgroud)

  • 您还可以将“10”(每页行数)替换为“input$Table_state$length”,以响应用户更改该参数。(这需要在数据表调用中使用 `stateSave=TRUE`,`DT::datatable(data, selection = "single",options=list(stateSave = TRUE))` ) (2认同)