在闪亮的应用程序中取消单击 DT::datatable 的行时隐藏 textOutput()

Hide textOutput() when un-click row of a DT::datatable in shiny app

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

当我按下 Next actionbutton() 时,文本显示子集数据帧的下一行数据。

但是当取消单击该行时,我希望再次隐藏此消息。

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, {
      if(is.null(input$tableId_rows_selected)){
        return(NULL)
      }
      else{
        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])
    })
  }
)

您可以在渲染 celltext 时检查 input$tableId_rows_selected 的长度。

library(shiny)

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, {
      if(is.null(input$tableId_rows_selected)){
        return(NULL)
      }
      else{
        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({
          if(length(input$tableId_rows_selected))  rv$text
          else ''
        })
      }
      
      
    })
    
    observeEvent(input[['next']], {
      rnum(rnum()+1)
      rv$text <- paste("flower",dt$data[rnum(),2],"has score",dt$data[rnum(),3])
    })
  }
)