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")]
,它将包括过滤行的 model
和 trans
列数据。
verbatimTextOutput
和toString
只是简单的展示验证和演示的结果。您也可以在其他上下文中使用结果。
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)
我想从 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")]
,它将包括过滤行的 model
和 trans
列数据。
verbatimTextOutput
和toString
只是简单的展示验证和演示的结果。您也可以在其他上下文中使用结果。
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)