R Shiny:从选定行获取数据

R Shiny : Get data from selected row

我想从 table 中提取数据用于计算。

我的起点是 https://shiny.rstudio.com/gallery/basic-datatable.html

基本上我希望能够 select 一行(比如第 8 行)并从中获取模型 = "a4 quattro" 和 trans = "manual(m5)"。

我已经寻找 examples 但看不到如何应用它。看起来很复杂,因为(在我看来)应该很简单。

这是我第一个 R-shiny 应用程序的第一天,我绝对迷路了。

有人可以帮忙吗?

这是一个基于您引用的 Shiny 示例的完整示例。这使用来自 ggplot2.

mpg 数据

首先,您可以创建一个 reactive 表达式来确定哪些行应该被过滤并显示在 table 中。每当您的 input 之一发生变化时, reactive 表达式将被重新计算。要访问过滤后的数据,您可以引用 filtered_rows()(注意括号)。

要获取选定的行,您可以使用 input$table_rows_selected,因为您的 dataTableOutput 称为 table(只需附加“_rows_selected”)。这可以是一行或多行,以及 returns 行号(例如,上面示例中的 8)。然后,要提取您的数据,您可以使用 filtered_rows()[input$table_rows_selected, c("model", "trans")],它将包括过滤行的 modeltrans 列数据。

verbatimTextOutputtoString只是简单的展示验证和演示的结果。您也可以在其他上下文中使用结果。

library(shiny)
library(DT)
library(ggplot2)

ui <- fluidPage(
  titlePanel("Basic DataTable"),
  
  # Create a new Row in the UI for selectInputs
  fluidRow(
    column(4,
           selectInput("man",
                       "Manufacturer:",
                       c("All",
                         unique(as.character(mpg$manufacturer))))
    ),
    column(4,
           selectInput("trans",
                       "Transmission:",
                       c("All",
                         unique(as.character(mpg$trans))))
    ),
    column(4,
           selectInput("cyl",
                       "Cylinders:",
                       c("All",
                         unique(as.character(mpg$cyl))))
    )
  ),
  # Create a new row for the table.
  DT::dataTableOutput("table"),
  verbatimTextOutput("text")
)

server <- function(input, output) {
  
  # Filter data based on selections
  filtered_rows <- reactive({
    data <- mpg
    if (input$man != "All") {
      data <- data[data$manufacturer == input$man,]
    }
    if (input$cyl != "All") {
      data <- data[data$cyl == input$cyl,]
    }
    if (input$trans != "All") {
      data <- data[data$trans == input$trans,]
    }
    data
  })
  
  # Show filtered data in the datatable
  output$table <- DT::renderDataTable(DT::datatable({ filtered_rows() }))
  
  # Show selected text
  output$text <- renderText({ toString(filtered_rows()[input$table_rows_selected, c("model", "trans")]) })
  
}

shinyApp(ui, server)