Shiny DT - Выберите строку после выбранной строки с помощью кнопки - PullRequest
0 голосов
/ 18 октября 2018

Пока что я выбираю строку таблицы данных, содержащую названия документов, и получаю информацию из базы данных относительно выбранного документа.Обзор этой информации находится в другой вкладке.Теперь мне нравится иметь кнопку «Далее», чтобы выбрать строку после выбранного, чтобы показать информацию о следующем документе.Я не могу использовать число + 1, потому что мои данные заказаны.Есть ли способ получить строку после выбранной мной строки с помощью кнопки?

ОБНОВЛЕНИЕ:

library(DT)
# ui
ui <- tagList(
  ui <- basicPage(
    h2("My Table"),
    DT::dataTableOutput("DT_show_docs"),
    textOutput("printScore"),
    actionButton("next_doc", "Next Document")
  )
)

# Server
server <- function(input, output, session) {
  doc_overview <- reactive({
    df <- data.frame(Doc_ID = seq(1,100), Filename = paste0("File_",seq(1,100)), Score = sample(1:10,100,replace=TRUE), Approved = rep(c("No", "Yes"), times = c(95,5)), Date = rep(seq(as.Date("2018/01/01"), as.Date("2018/1/10"), "days"), length.out=100))
    return(df)
  })

  output$DT_show_docs <- renderDataTable({

    DT::datatable(doc_overview(), 
                  options = list(
                    searching       = FALSE,
                    order           = list(list(3, 'desc'))),
                  selection = "single")

  })

  output$printScore <- renderText({
    row <- input$DT_show_docs_rows_selected
    text <- doc_overview()[row, "Filename"]
  })

  observeEvent(input$next_doc, {
   # Function to select next row/document from datatable. When the button is clicked,
   # and the first row is selected at this moment, I want to select/print the second 
   # row and so on.
  })
}

# app
shinyApp(ui = ui, server = server)

1 Ответ

0 голосов
/ 19 октября 2018

У меня есть чувство (может быть ошибочным), что это может быть XY Проблема ловушка, т. Е. Вы просите о помощи с вашей попыткой в решении проблемы, а не сосновная проблема сама.Если это так, вам лучше задать еще один вопрос, объясняющий ваши основные требования, которые могут привести к более простому общему решению.Хотя мое решение довольно простое, все это кажется ненужным осложнением.

В любом случае, вот один из способов сделать это.Вы можете получить текущий порядок строк в таблице данных, используя input$tableId_rows_all, который дает индексы строк на всех страницах (после того, как таблица отфильтрована по строкам поиска).output$test показывает этот порядок в режиме реального времени.Теперь вам просто нужно циклически выполнять этот порядок каждый раз, когда пользователь нажимает кнопку действия next_doc.

Это решение будет работать, даже если вы измените порядок строк или вручную измените выбранную строку.

library(shiny)
library(DT)

ui <- tagList(
  ui <- basicPage(
    h2("My Table"),
    DT::dataTableOutput("DT_show_docs"),
    textOutput("printScore"),
    actionButton("next_doc", "Next Document"),
    verbatimTextOutput("test")
  )
)

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

  doc_overview <- reactive({
    df <- data.frame(Doc_ID = seq(1,12), 
                     Filename = paste0("File_",seq(1,12)), 
                     Score = sample(1:10,12,replace=TRUE), 
                     Approved = rep(c("No", "Yes"), times = c(5,7)), 
                     Date = rep(seq(as.Date("2018/01/01"), as.Date("2018/1/10"), "days"), length.out=12))
    return(df)
  })

  output$DT_show_docs <- renderDataTable({

    DT::datatable(doc_overview(), 
                  options = list(
                    searching       = FALSE,
                    order           = list(list(3, 'desc'))),
                  selection = "single")

  })

  row_index <- reactiveValues(index = 1)

  observe({ # reset row_index when you manually select any row
    row_index$index <- which(input$DT_show_docs_rows_selected == input$DT_show_docs_rows_all)
  })

  DT_show_docs_proxy <- dataTableProxy("DT_show_docs")

  output$printScore <- renderText({
    row <- input$DT_show_docs_rows_selected
    text <- doc_overview()[row, "Filename"]
  })

  observeEvent(input$next_doc, {
   # Function to select next row/document from datatable. When the button is clicked,
   # and the first row is selected at this moment, I want to select/print the second 
   # row and so on.
    req(input$DT_show_docs_rows_selected) # must select some row before using next_doc button
    row_order <- input$DT_show_docs_rows_all # gives current order of rows
    row_index$index <- isolate(row_index$index) + 1 # cycles throw the order one by one when you click next_button
    selectRows(DT_show_docs_proxy, selected = row_order[row_index$index]) # selects the row of current index
  })

  output$test <- renderPrint({
    input$DT_show_docs_rows_all # shows the order of rows in real time
  })
}

# app
shinyApp(ui = ui, server = server)
...