R shiny:renderTable重置输入$ tableid_rows_selected value

时间:2016-02-15 03:15:03

标签: r shiny

背景:我使用以下代码创建一个简单的表:

output$mytable = DT::renderDataTable({
              datatable(data_frame_object, selection='single')
              }) 

请注意,selection='single'使得一次只显示一行选定的行。 我使用以下代码跟踪用户选择的行:

index=input$mytable_rows_selected

问题:我遇到的问题是,每次选择新行时,我都要重置index=input$mytable_rows_selected的值。 目前,如果用户选择第1行,则索引将具有值[1]。如果用户然后选择第2行,则索引的值为[1,2]。但是,我只想让索引的值为[2]。

尝试解决方案:我的解决方法是使用index [length(index)]来获取上次选择的行,但这不适合我的目的。

使用虹膜数据的工作示例:

library(shiny)
library(DT)

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

  output$mytable = DT::renderDataTable({
    datatable(iris[,c(1,4,5)],selection='single')
  }, 
  options = list(lengthMenu = c(5, 30, 50), pageLength = 10, orderClasses=TRUE)
  ) 

  output$info = DT::renderDataTable({

    index=input$mytable_rows_selected

    if (length(index)){
      index2=index[length(index)]
    }
    else{
      index2=index
    }
    iris[index2,c(1,4)]
  }, 
  options = list(pageLength = 5, orderClasses=TRUE, searching=FALSE)
  )

}

ui <- fluidPage(

  fluidRow(
    column(4,dataTableOutput('mytable')),

    column(6,offset=1,
           tabsetPanel(type="tabs", 
                       tabPanel("hi",dataTableOutput('info')))
    )   
  )
)

1 个答案:

答案 0 :(得分:0)

试试此代码

library(shiny)
library(DT)

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

  output$mytable = DT::renderDataTable({
    datatable(iris[,c(1,4,5)],selection='single')
  }, 
  options = list(lengthMenu = c(5, 30, 50), pageLength = 10, orderClasses=TRUE)
  ) 

  selected.rows <- reactiveValues(index = NULL)

  observe({
      selected.rows$index <- input$mytable_rows_selected
  })

  output$info = DT::renderDataTable({

    index=selected.rows$index

    if (length(index)){
      index2=index[length(index)]
    }
    else{
      index2=index
    }
    iris[index2,c(1,4)]
  }, 
  options = list(pageLength = 5, orderClasses=TRUE, searching=FALSE)
  )

}

ui <- fluidPage(

  fluidRow(
    column(4,dataTableOutput('mytable')),

    column(6,offset=1,
           tabsetPanel(type="tabs", 
                       tabPanel("hi",dataTableOutput('info')))
    )   
  )
)