首页 > 解决方案 > 使用 actionbutton 移动到闪亮应用程序中的下一行数据框

问题描述

我有shiny下面的应用程序,当用户单击数据表的一行时,子集会发生在另一个数据框中df并显示文本。

我想在按下Next actionbutton()文本时显示子集数据框的下一行的数据。在这种情况下,它应该显示"flower b has score 5".

我的原始数据会有很多行,所以Next每次按下时我都需要根据对应的行来调整文本。

shinyApp(
  ui = fluidPage(DT::dataTableOutput('tableId'),
                 textOutput("celltext"),
                 actionButton("next","Next")),
  server = function(input, output) {
    output$tableId = DT::renderDataTable(
      iris[,c(1,5)],  selection = list(target = 'row',mode="single")
    )
    species<-c("setosa","setosa","virginica","virginica")
    flower<-c("a","b","c","d")
    score<-c(7,5,6,9)
    df<-data.frame(species,flower,score)
    
    observeEvent(input$tableId_rows_selected, {
    output$celltext <- renderText({
      cell <- input$tableId_rows_selected
      dat<-df[df$species %in% iris[cell,5],]
      df <-dat[order(dat$score,decreasing = T),]
      df
      paste("flower",df[1,2],"has score",df[1,3])
    })
    })
  }
)

标签: rshinydt

解决方案


定义reactiveValues对象会有所帮助。也许你正在寻找这个

shinyApp(
  ui <- fluidPage(DT::dataTableOutput('tableId'),
                 textOutput("celltext"),
                 actionButton("next","Next")),

  server <- function(input, output) {
    rv <- reactiveValues(text=NULL)
    dt <- reactiveValues(data=NULL)
    rnum <- reactiveVal(0)
    output$tableId = DT::renderDataTable(
      iris[,c(1,5)],  selection = list(target = 'row',mode="single")
    )
    species<-c("setosa","setosa","virginica","virginica","setosa","setosa","virginica","virginica")
    flower<-c("a","b","c","d","e","f","g","h")
    score<-c(7,5,6,9,1,2,3,4)
    df<-data.frame(species,flower,score)

    observeEvent(input$tableId_rows_selected, {
      row <- input$tableId_rows_selected
      dat<-df[df$species %in% iris[row,5],]
      dt$data <-dat[order(dat$score,decreasing = T),]
      rv$text <- paste("flower",dt$data[1,2],"has score",dt$data[1,3])
      rnum(1)
      output$celltext <- renderText({
        rv$text
      })

    })

    observeEvent(input[['next']], {
      rnum(rnum()+1)
      rv$text <- paste("flower",dt$data[rnum(),2],"has score",dt$data[rnum(),3])
    })
  }
)

推荐阅读