【问题标题】:R (shiny): Create a drop down list that produces plots dynamicallyR(闪亮):创建一个动态生成图的下拉列表
【发布时间】:2014-10-12 20:03:47
【问题描述】:

我想知道如何使用下拉菜单传递输入参数,这些输入参数是可以动态生成绘图的数据框。

我已经能够创建一个能够正确呈现 UI 的闪亮应用程序,但它始终会生成与 2012 年数据关联的图(无论从下拉菜单中选择哪一年)。似乎正在发生的事情是我使用的 renderPlot 函数无法识别 input$year 参数,因此我的控制流只呈现最后一个 ggplot(在“else”语句之后)。那么,我的问题是如何从我的 ui.R 文件中的下拉菜单中创建一个输入,该输入将被 server.R 文件识别,并允许用户根据他们选择的年份动态渲染绘图。这是否与使用 reactive() 函数有关?任何帮助将不胜感激。

这里是server.R代码:

library(ggplot2)
library(plyr)
library(shiny)

business1986 <- readRDS("data/business1986.rds")
business1991 <- readRDS("data/business1991.rds")
business1999 <- readRDS("data/business1999.rds")
business2005 <- readRDS("data/business2005.rds")
business2012 <- readRDS("data/business2012.rds")

shinyServer(function(input, output){

    output$Plot <- renderPlot({
    if(input$year == "1986") {     
        ggplot(business1986, aes(x=Category, y=Workers)) + geom_bar(stat="identity", aes(fill=Category)) +
            labs(title="Number of Workers in Orange County by Sector, 1986") +
            theme(plot.title = element_text(face="bold", size = 17, vjust = 1.5)) +
            theme(legend.title = element_text(size=13)) +
            scale_y_continuous(labels = comma) + scale_fill_brewer() 
    } else if(input$year == "1991") {
        ggplot(business1991, aes(x=Category, y=Workers)) + geom_bar(stat="identity", aes(fill=Category)) +
            labs(title="Number of Workers in Orange County by Sector, 1991") +
            theme(plot.title = element_text(face="bold", size = 17, vjust = 1.5)) +
            theme(legend.title = element_text(size=13)) +
            scale_y_continuous(labels = comma) + scale_fill_brewer() 
    } else if(input$year == "1999"){
        ggplot(business1999, aes(x=Category, y=Workers)) + geom_bar(stat="identity", aes(fill=Category)) +
            labs(title="Number of Workers in Orange County by Sector, 1999") +
            theme(plot.title = element_text(face="bold", size = 17, vjust = 1.5)) +
            theme(legend.title = element_text(size=13)) +
            scale_y_continuous(labels = comma) + scale_fill_brewer() 
    } else if(input$year == "2005") {
        ggplot(business2005, aes(x=Category, y=Workers)) + geom_bar(stat="identity", aes(fill=Category)) +
            labs(title="Number of Workers in Orange County by Sector, 2005") +
            theme(plot.title = element_text(face="bold", size = 17, vjust = 1.5)) +
            theme(legend.title = element_text(size=13)) +
            scale_y_continuous(labels = comma) + scale_fill_brewer() 
    } else {
        ggplot(business2012, aes(x=Category, y=Workers)) + geom_bar(stat="identity", aes(fill=Category)) +
            labs(title="Number of Workers in Orange County by Sector, 2012") +
            theme(plot.title = element_text(face="bold", size = 17, vjust = 1.5)) +
            theme(legend.title = element_text(size=13)) +
            scale_y_continuous(labels = comma) + scale_fill_brewer() 
    }
            })

    })

这里是 ui.R 代码:

shinyUI(fluidPage(
    titlePanel("Economic Change in Orange County, CA"),
    sidebarLayout(
        sidebarPanel(h3("Choose a Year"), position="left",
        helpText("Observe econommic change in Orange County between 1986 and 2010
                 by adjusting the controls below."),
        selectInput("year", label = h5("Select Year"), 
                    choices = list("1986" = 1, "1991" = 2,
                                   "1999" = 3, "2005" = 4,
                                   "2012" = 5), selected = 1)),
        mainPanel(h3("Business Sector Composition"), 
                  plotOutput("Plot"), 
                  position="right")
    )
    )
)

【问题讨论】:

  • 我不能肯定地说,因为您没有提供测试代码的数据,但看起来您正在检查 input$year 的名称而不是 if..else 块中的值.不要使用if(input$year == "1986"),而是尝试使用if(input$year == 1) 等...看看是否可行。
  • 太好了,我试试
  • 谢谢,成功了!虽然解决方案会复杂得多!
  • @user3619356 如果您将c("1986", "1991", "1999", "2005", "2012) 传递给choices 参数而不是命名列表,您的代码将可以工作(顺便说一句,您也可以使用命名向量,而是调用clist,但传递了相同的论点……我认为 Shiny 以同样的方式对待它们)。但无论如何,命名向量更好,imo。

标签: r shiny rstudio


【解决方案1】:

我使用了此代码,它适用于您所描述的相同场景。 Reactive()是我用过的。

ui <- fluidPage(
  sidebarLayout(

  sidebarPanel(
  selectInput(inputId = "diamonds", 
              label = "choose a category in Diamonds", 
              choices = c("Length", "Breath", "Height"," Please Select a Type "),


  ))

)

server <- function(input, output){

  datasetInput <- reactive({ 
    switch(input$dataset, 
           "Length" = diamonds$x, 
           "Breath" = diamonds$y, 
           "Height" = diamonds$z,
           " Please Select a Type " = NULL) 
  }) 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-04-05
    • 1970-01-01
    • 1970-01-01
    • 2018-07-22
    • 2016-04-22
    • 2015-08-03
    • 2014-12-10
    • 1970-01-01
    相关资源
    最近更新 更多