r-shiny:如何添加滑块以过滤数字输入



所以我正在使用MPG数据集来练习我的r-shiny技能,但是我遇到了问题。

我想编写一个应用程序,我可以选择不同的变量来制作图形,如果它涉及至少一个离散变量,那么我绘制一个geom_boxplot,否则,我只会绘制一个geom_point。

现在我想添加一个滑块以滤波数字输入,但是如何?

我的ui.r看起来像这样:

library(shiny)
shinyUI(fluidPage(
  # Application title
  titlePanel("Old Faithful Geyser Data"),
  # Sidebar with a slider input for number of bins
  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "var1",
                  label = "Choose x variable",
                  choices = 
                    names(mpg)
      ),
      selectInput(inputId = "var2",
                  label = "Choose y variable",
                  choices = 
                    names(mpg))
      ),
    # Show a plot of the generated distribution
  mainPanel(
      plotOutput("distPlot")
    )
  )
))

和我的server.r看起来像这样:

server <- function(input,output){
output$distPlot <- renderPlot({
# browser()
if(typeof(mpg[[input$var1]]) == "character")
{
  ggplot(mpg) +
    xlab(input$var1) +
    ylab(input$var2) +
    ggtitle(paste("Plot", input$var1, "vs", input$var2)) +
    geom_boxplot(mapping =
      aes_string(x = input$var1,
                 y = input$var2))
}
else
{
  ggplot(mpg) +
    xlab(input$var1) +
    ylab(input$var2) +
    ggtitle(paste("Plot", input$var1, "vs", input$var2)) +
    geom_point(mapping =
      aes_string(x = input$var1,
                 y = input$var2))
}
})
}

现在,如何添加一个滑块以过滤数字输入?

我是一个新的学习者,请帮助我。非常感谢

很抱歉,我没有时间将此演示充实为一个更好的例子,但希望这将向您展示方法:

library(shiny)
library(ggplot2)
library(magrittr)
ui <- fluidPage(
  # Application title
  titlePanel("Optional Numeric Slider Demo"),

  sidebarLayout(
    sidebarPanel(
      selectInput(inputId = "var1",
                  label = "Choose x variable",
                  choices = 
                    names(mpg)
      ),
                       uiOutput('Var1Slider'),
                      br(),
      selectInput(inputId = "var2",
                  label = "Choose y variable",
                  choices = 
                    names(mpg)[sapply(mpg,class)=="character"])
    ),
    mainPanel(
      plotOutput("distPlot")
    )
  )
)
server <- function(input,output){
  output$distPlot <- renderPlot({

    if(typeof(mpg[[input$var1]]) == "character")
    {
      ggplot(mpg) +
        xlab(input$var1) +
        ylab(input$var2) +
        ggtitle(paste("Plot", input$var1, "vs", input$var2)) +
        geom_boxplot(mapping =
                       aes_string(x = input$var1,
                                  y = input$var2))
    }
    else
    {
      mpg %>%
        dplyr::filter(get(input$var1)>input$Var1Slide[1]) %>%
        dplyr::filter(get(input$var1)<input$Var1Slide[2]) %>%
      ggplot() +
        xlab(input$var1) +
        ylab(input$var2) +
        ggtitle(paste("Plot", input$var1, "vs", input$var2)) +
        geom_point(mapping =
                     aes_string(x = input$var1,
                                y = input$var2))
    }
  })
  output$Var1Slider <- renderUI({
    if(typeof(mpg[[input$var1]]) == "character"){
      return(NULL)
    }else{
    sliderInput('Var1Slide',
                label=paste("selected:",input$var1),
                min=min(mpg[[input$var1]]),
                max=max(mpg[[input$var1]]),
                value=c(min(mpg[[input$var1]]),max(mpg[[input$var1]])),
                step = 1)}
  })
}
# Run the application 
shinyApp(ui = ui, server = server)

关键点是使用renderUIuiOutput将计算移至服务器端。我还为数字图代码添加了一行,以显示如何使用输入(即使目前编辑是荒谬的)。让我知道是否有什么尚不清楚。

edit :我已经更改了此示例,以便滑块值实际上将数据滤光到图中。

最新更新