我正在尝试在我的Shiny应用程序中实现一项功能。问题是双重的:
是否可以从同一个变量获得2个输入?我有一个变量是一个指标列表。我希望用户能够使用selectInput选择2个指标,然后绘制散点图。必须有2个selectInput,因为应用程序的其他部分将仅依赖于第一个selectInput。我的数据很长。如果因为我的数据包含纬度和经度信息,我不认为它可以工作,因此创建一个带名称(数据)的selectInput是没有意义的。
如果我可以从同一个变量中获得2个selectInput,那么我将如何调用我的图中的值,因为该值被称为' value'两个输入?
编辑:按照格雷戈尔的建议用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)
答案 0 :(得分:1)
您可以使用aes_string
将input$indicators
和input$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引用这两个输入(这不是问题)。