根据另一个数据 table 的单元格选择对数据 table 进行子集化

Subset a data table based on cell selection of another datatable

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

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)

见下面的代码。您正在尝试对数据进行子集化而不是创建一个新的数据框(从上面听起来像您想要的)+您想使用 [tablename]_cell_clicked 它有 row, column, value 列表与 [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)