【问题标题】:R Shiny : Get data from selected rowR Shiny:从选定行获取数据
【发布时间】:2021-12-20 12:57:04
【问题描述】:

我想从表格中提取数据以用于计算。

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

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

我一直在寻找examples,但看不到如何应用它。 (在我看来)应该简单的东西似乎非常复杂。

这是我第一次使用 R-shiny 应用程序的第一天,我肯定迷路了。

有人可以帮忙吗?

【问题讨论】:

    标签: r shiny reactive


    【解决方案1】:

    这是基于您引用的 Shiny 示例的完整示例。这使用来自ggplot2mpg 数据。

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

    要获取选定的行,您可以使用input$table_rows_selected,因为您的dataTableOutput 被称为table(只需附加“_rows_selected”)。这可以是一行或多行,并返回行号(例如,上面示例中的 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)
    

    【讨论】:

    • 太好了!我知道这一定很简单。还有一点......是什么决定是选择一行还是多行?
    • datatable 有多个选项可供您使用,请使用?datatable 查看...例如,如果您尝试datatable(filtered_rows(), selection = "single"),您将只能选择一个而不能多个...
    • 非常感谢 - 我见过 selection = "single" 但不知道如何应用它。这真的很有帮助
    猜你喜欢
    • 2017-11-29
    • 2015-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-02
    • 2017-12-11
    • 1970-01-01
    相关资源
    最近更新 更多