r - 更新闪亮的标签
问题描述
我正在尝试构建一个带有多个选项卡的 Shiny 应用程序。其中一个选项卡供用户选择基础数据集,我希望这些数据以漂亮的图表显示在另一个选项卡中。(我将基础数据保存在最大大小的文件中,用户可以一次调查一个,因为我担心否则 Shiny 应用程序可能会变得难以忍受甚至崩溃)。但是,我正在努力更新保存基础数据的变量,如下面的简化的可重现示例所示:
library(shiny)
library(shinyWidgets)
library(dplyr)
library(ggplot2)
dataFrameA <- data.frame(
company = c("A", "B", "C", "D"),
revenue = runif(4, min = 0, max = 1000000)
)
dataFrameB <- data.frame(
company = c("E", "F", "G", "H"),
revenue = runif(4, min = 0, max = 1000000)
)
usedDataFrame <- dataFrameA
ui <- fluidPage(
verticalTabsetPanel(
verticalTabPanel(
title = "graph", icon = icon("chart-bar", "fa-1x", lib = "font-awesome"),
box_height = "120px",
plotOutput(outputId = "barChart")
),
verticalTabPanel(
title = "data", icon = icon("database", "fa-1x", lib = "font-awesome"),
box_height = "120px",
selectInput(inputId = "selectData", label = "choose dataset",
choices = c("ABCD", "EFGH"))
)
)
)
server <- function(input, output){
output$barChart <- renderPlot({
ggplot(data = usedDataFrame, aes(x = company, y = revenue)) +
geom_bar(width = 1, stat = "identity")
})
observeEvent(input$selectData, {
if (input$selectData == "ABCD"){
usedDataFrame <- dataFrameA
}else{
usedDataFrame <- dataFrameB
}
})
}
shinyApp(ui = ui, server = server)
您会看到,尽管用户在“数据”选项卡中选择了不同的数据集,但“图表”选项卡中的图表不会改变。但是,我预计它会发生变化,因为下面的 observeEvent 块会更改图形所基于的全局变量 usedDataFrame。谁能给我一个提示,说明我上面的假设是如何错误的,或者指出更新基础数据集的更聪明的方法?简单的解释最有帮助(我没有技术背景)。
解决方案
您非常接近您的方法,但是比处理全局变量更简单的方法可以使用reactive
它将根据您的input
.
library(shiny)
library(shinyWidgets)
library(dplyr)
library(ggplot2)
dataFrameA <- data.frame(
company = c("A", "B", "C", "D"),
revenue = runif(4, min = 0, max = 1000000)
)
dataFrameB <- data.frame(
company = c("E", "F", "G", "H"),
revenue = runif(4, min = 0, max = 1000000)
)
ui <- fluidPage(
verticalTabsetPanel(
verticalTabPanel(
title = "graph", icon = icon("chart-bar", "fa-1x", lib = "font-awesome"),
box_height = "120px",
plotOutput(outputId = "barChart")
),
verticalTabPanel(
title = "data", icon = icon("database", "fa-1x", lib = "font-awesome"),
box_height = "120px",
selectInput(inputId = "selectData", label = "choose dataset",
choices = c("ABCD", "EFGH"))
)
)
)
server <- function(input, output){
dat <- reactive({
if (input$selectData == "ABCD") {
return(dataFrameA)
}
else if (input$selectData == "EFGH") {
return(dataFrameB)
}
})
output$barChart <- renderPlot({
ggplot(data = dat(), aes(x = company, y = revenue)) +
geom_bar(width = 1, stat = "identity")
})
}
shinyApp(ui = ui, server = server)