【问题标题】:Subset a data table based on cell selection of another datatable基于另一个数据表的单元格选择子集数据表
【发布时间】:2019-10-29 22:24:13
【问题描述】:

我有一个带有 3 个数据表的闪亮应用。第一个仅包含带有Species 的第5 行,第二个表包含一些随机的Species,第三个表应该从前两个表中获取选定的单元格并将它们组合成一个新表。虽然第一个似乎工作正常,但第二个表格选择似乎是错误的,这是因为它按单元格位置而不是单元格值进行子集。

library(shiny)
library(DT)
data("mtcars")

ui <- shinyUI(
  fluidRow(
    DT::dataTableOutput("myDatatable"),
    DT::dataTableOutput("myDatatable2"),
    DT::dataTableOutput("myDatatable3")

  )

)

server <- shinyServer(function(input, output, session) {
  output$myDatatable <- DT::renderDataTable(matrix(iris[,5]), 
                                            selection=list( target="cell"),
                                            server = FALSE,
                                            rownames=FALSE)
  output$myDatatable2 <- DT::renderDataTable(matrix(iris[c(25,78,67,45,90,66,78,9,8),5]), 
                                            selection=list(mode="single", target="cell"),
                                            server = FALSE,
                                            rownames=FALSE)
  output$myDatatable3 <- DT::renderDataTable(iris[c(input$myDatatable_cells_selected,input$myDatatable2_cells_selected),], 
                                             server = FALSE,
                                             rownames=FALSE)
})

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny dt


    【解决方案1】:

    见下面的代码。您试图对数据进行子集化,而不是创建一个新的数据框(从上面听起来像您想要的)+ 您想使用 [tablename]_cell_clicked,它有一个 rowcolumnvalue 列表与 [tablename]_cells_selected

    library(shiny)
    library(DT)
    data("mtcars")
    
    ui <- shinyUI(
      fluidRow(
        DT::dataTableOutput("myDatatable"),
        DT::dataTableOutput("myDatatable2"),
        DT::dataTableOutput("myDatatable3")
    
      )
    
    )
    
    server <- shinyServer(function(input, output, session) {
    
    
      dat1 <- reactive({
        matrix(iris[,5])
      })
    
      dat2 <- reactive({
        matrix(iris[c(25,78,67,45,90,66,78,9,8),5])
      })
    
      dat3 <- reactive({
        temp <- data.frame(results = c(input$myDatatable_cell_clicked$value, input$myDatatable2_cell_clicked$value))
      })
    
    
    
    
      output$myDatatable <- DT::renderDataTable(dat1(), 
                                                selection=list( target="cell"),
                                                server = FALSE,
                                                rownames=FALSE)
      output$myDatatable2 <- DT::renderDataTable(dat2(), 
                                                 selection=list(mode="single", target="cell"),
                                                 server = FALSE,
                                                 rownames=FALSE)
      output$myDatatable3 <- DT::renderDataTable(dat3(), 
                                                 server = FALSE,
                                                 rownames=FALSE)
    })
    
    shinyApp(ui, server)
    

    **根据 OP 的说明更新

    library(shiny)
    library(DT)
    data("mtcars")
    
    ui <- shinyUI(
      fluidRow(
        DT::dataTableOutput("myDatatable"),
        DT::dataTableOutput("myDatatable2"),
        DT::dataTableOutput("myDatatable3")
    
      )
    
    )
    
    server <- shinyServer(function(input, output, session) {
    
    
      dat1 <- reactive({
        matrix(iris[,5])
      })
    
      dat2 <- reactive({
        matrix(iris[c(25,78,67,45,90,66,78,9,8),5])
      })
    
      dat3 <- reactive({
    
        dat1row <- input$myDatatable_cells_selected
        dat2row <- c(25,78,67,45,90,66,78,9,8)[c(input$myDatatable2_cell_clicked$row)]
    
    
        temp <- iris[c(dat1row, dat2row),]
      })
    
    
    
    
      output$myDatatable <- DT::renderDataTable(dat1(), 
                                                selection=list( target="cell"),
                                                server = FALSE,
                                                rownames=FALSE)
      output$myDatatable2 <- DT::renderDataTable(dat2(), 
                                                 selection=list(mode="single", target="cell"),
                                                 server = FALSE,
                                                 rownames=FALSE)
      output$myDatatable3 <- DT::renderDataTable(dat3(), 
                                                 server = FALSE,
                                                 rownames=FALSE)
    })
    
    shinyApp(ui, server)
    

    【讨论】:

    • 也许我不清楚,但我希望整行显示在第三个表中,而不仅仅是选定的值
    • 已根据您的要求更新。您的问题是您试图获取第二个表的行,但表行是 1-9,它不会为您提供数据集的原始行(25、78 等)。您只需从向量中选择正确的值即可!
    • 谢谢,但它只显示第一个表中最后选择的值,而我需要所有选择
    • 然后使用 [tablename]_cells_selected 使用原始答案的一部分。我已经更新了我的答案以包含它
    猜你喜欢
    • 2020-06-26
    • 2016-03-12
    • 1970-01-01
    • 1970-01-01
    • 2011-11-20
    • 2012-06-22
    • 1970-01-01
    • 2013-10-07
    • 2018-05-19
    相关资源
    最近更新 更多