【发布时间】:2018-09-17 18:48:57
【问题描述】:
我有一个数据集,它是特定类别的汇总数据集。 我有另一个数据集,它提供了每个类别的详细信息(我们从中计算了汇总统计数据)。
我希望能够在选项卡中拥有两个数据集,但我希望能够单击摘要数据集的一行并仅调用该特定类别的数据。
所以,如果我对 iris 数据集的每个物种都有一组汇总均值:
Species Sepal.Length Sepal.Width Petal.Length Petal.Width n..
1 setosa 5.006 3.428 1.462 0.246 50
2 versicolor 5.936 2.770 4.260 1.326 50
3 virginica 6.588 2.974 5.552 2.026 50
我希望能够单击一条线,然后调用每个物种的数据子集。例如,如果我单击 Setosa 的行,我希望在第二个选项卡中看到以下内容:
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
...
我已经寻找了一些线索,但没有找到任何有效的方法。
任何帮助将不胜感激。我在下面包含了一个工作闪亮的应用程序:
#### Shiny app test ####
#### Read in necessary libraries ####
library(shiny)
library(flexdashboard)
library(shinydashboard)
library(shinythemes)
library(DT)
library(dplyr)
#### Necessary functions
#### create some data ####
data1<-iris %>%
group_by(Species) %>%
dplyr::summarize(Sepal.Length=mean(Sepal.Length,na.rm=TRUE),
Sepal.Width=mean(Sepal.Width,na.rm=TRUE),
Petal.Length=mean(Petal.Length,na.rm=TRUE),
Petal.Width=mean(Petal.Width,na.rm=TRUE),
n())
data2<-iris
#### UI function ####
ui <- dashboardPage(
dashboardHeader(title="Shiny Tool"),
dashboardSidebar(),
dashboardBody(
tabsetPanel(
tabPanel("page1",
div(DT::dataTableOutput("page1"), style=c("color:black"))
),
tabPanel("page2",
div(DT::dataTableOutput("page2"), style=c("color:black"))
)
)
)
)
#### Server function ####
server <- shinyServer(function(input, output, session) {
output$page1 = DT::renderDataTable({
data1
})
output$page2 <- DT::renderDataTable({
data2
})
})
shinyApp(ui = ui, server = server)
更新:
使用下面的@JasonAizkalns 建议,我尝试在 Shiny 中实现这一点,但在第二个选项卡中出现错误(“'data' must be 2-dimensional (e.g. data frame or matrix)”)。
这是我的代码:
#### Shiny app test ####
#### Read in necessary libraries ####
library(shiny)
library(flexdashboard)
library(shinydashboard)
library(shinythemes)
library(DT)
library(dplyr)
#### Necessary functions
#### create some data ####
data1<-iris %>%
group_by(Species) %>%
dplyr::summarize(Sepal.Length=mean(Sepal.Length,na.rm=TRUE),
Sepal.Width=mean(Sepal.Width,na.rm=TRUE),
Petal.Length=mean(Petal.Length,na.rm=TRUE),
Petal.Width=mean(Petal.Width,na.rm=TRUE),
n())
data2<-iris
#### UI function ####
ui <- dashboardPage(
dashboardHeader(title="Shiny Tool"),
dashboardSidebar(),
dashboardBody(
tabsetPanel(
tabPanel("page1",
div(DT::dataTableOutput("page1"), style=c("color:black"))
),
tabPanel("page2",
div(DT::dataTableOutput("page2"), style=c("color:black"))
)
)
)
)
#### Server function ####
server <- shinyServer(function(input, output, session) {
selected_row = reactive({validate(need(selected_row > 0, "Please select a row."))
input$summary_data_rows_selected})
selected_species = reactive(data1$Species[selected_row])
temp = reactive(data2 %>% dplyr::filter(Species==selected_species))
output$page1 = DT::renderDataTable({
data1
}, selection = 'single')
output$page2 <- DT::renderDataTable({
temp
})
})
shinyApp(ui = ui, server = server)
【问题讨论】: