在Shiny&中创建几个来自同一变量的selectInputs呼吁情节

时间:2018-01-05 18:01:36

标签: r ggplot2 shiny

我正在尝试在我的Shiny应用程序中实现一项功能。问题是双重的:

  1. 是否可以从同一个变量获得2个输入?我有一个变量是一个指标列表。我希望用户能够使用selectInput选择2个指标,然后绘制散点图。必须有2个selectInput,因为应用程序的其他部分将仅依赖于第一个selectInput。我的数据很长。如果因为我的数据包含纬度和经度信息,我不认为它可以工作,因此创建一个带名称(数据)的selectInput是没有意义的。

  2. 如果我可以从同一个变量中获得2个selectInput,那么我将如何调用我的图中的值,因为该值被称为' value'两个输入?

  3. 编辑:按照格雷戈尔的建议用aes_string引用输入,我希望以下mtcars的例子聚集成长格式才能工作,但我得到一个美学或对象未找到错误。我想我可能需要过滤数据,但我不明白我该怎么做,因为我的变量指标现在指的是两个指标'和'指标2'。即,我无法

    filtered <- 
          cars %>%
          filter(indicators == input$indicators,
                 indicators == input$indicators2) 
    

    也许我需要创建一个创建新数据框的反应式表达式?这是我的非工作可重现代码,具有长格式mtcars:

    library(ggplot2)
    library(shiny)
    
    cars <- mtcars %>%
      gather(indicators, value, mpg:carb)
    
    
    ui <- fluidPage(
    
      # Application title
      titlePanel("mtcars"),
    
      sidebarLayout(
        sidebarPanel(
          selectInput("indicators",
                      label = "select indicator:",
                      choices = c("mpg", "cyl",  "disp", "hp",  "drat", "wt",   "qsec", "vs",   "am",   "gear", "carb")
                        ),
          selectInput("indicators2",
                      label = "select indicator:",
                      choices = c("mpg", "cyl",  "disp", "hp",  "drat", "wt",   "qsec", "vs",   "am",   "gear", "carb")
                      )
        ),
    
        mainPanel(
          plotOutput("carsPlot")
        )
      )
    )
    
    server <- function(input, output) {
    
      output$carsPlot <- renderPlot({
        ggplot(cars, aes_string(x = input$indicators, y = input$indicators2)) +
          geom_point(shape = 1)
      })
    }
    
    # Run the application 
    shinyApp(ui = ui, server = server)
    

3 个答案:

答案 0 :(得分:1)

您可以使用aes_stringinput$indicatorsinput$indicators2传递给ggplot。由于ggplot可以更好地处理长数据,因此无需将数据转换为宽格式。

library(ggplot2)
library(shiny)

ui <- fluidPage(
  # Application title
  titlePanel("mtcars"),
  sidebarLayout(
    sidebarPanel(
      selectInput("indicators",
                  label = "select indicator:",
                  choices = names(mtcars)),
      selectInput("indicators2",
                  label = "select indicator:",
                  choices = names(mtcars))
    ),
    mainPanel(
      plotOutput("carsPlot")
    )
  )
)

server <- function(input, output) {
  output$carsPlot <- renderPlot({
    ggplot(mtcars, aes_string(x = input$indicators, y = input$indicators2)) +
      geom_point(shape = 1)
  })
}

# Run the application 
shinyApp(ui = ui, server = server)

答案 1 :(得分:0)

这是另一种在多种模式下具有selectInput的解决方案。

library(dplyr)
library(tidyr)
library(ggplot2)
library(shiny)

cars <- mtcars %>%
  gather(indicators, value, mpg:carb)


ui <- fluidPage(

  titlePanel("mtcars"),

  sidebarLayout(
    sidebarPanel(
      uiOutput("ui_indicators")
    ),

    mainPanel(
      plotOutput("carsPlot")
    )
  )
)

server <- function(input, output) {

  output$ui_indicators <- renderUI({
    choices <- unique(cars$indicators)
    selectInput("indicators",
                label = "select indicators :",
                choices = choices,
                multiple = TRUE)
  })


  output$carsPlot <- renderPlot({

    filtered <- cars %>% filter(indicators %in% input$indicators)

    ggplot(filtered, aes(x = indicators, y = value)) +
      geom_point(shape=1)

  })
}

# Run the application 
shinyApp(ui = ui, server = server)

答案 2 :(得分:0)

基于来自Gregor的aes_string上的提示,我设法解决了这个问题。我最终使用了宽数据并添加了一个适当的被动语句,该语句从所选指标中创建了一个新的数据框。

我的服务器功能现在看起来像这样:

server <- function(input, output) {

  selectedVars <- reactive({
    cars[, c(input$indicators, input$indicators2)]
  })

  output$carsPlot <- renderPlot({
    ggplot(selectedVars(), aes_string(x = input$indicators, y = input$indicators2)) +
      geom_point(shape = 1)
  })
}

一切都很美妙,我开始更多地了解Shiny中反应函数的效用:)

Gregor de Cillia提供了我正在寻找的答案。 可以使用aes_string引用这两个输入(这不是问题)。