繁体   English   中英

R-shiny:如何添加滑块来过滤数字输入?

[英]R-shiny: How to add a slider to filter the numeric input?

所以我使用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将计算转移到服务器端。 我还在数字图形代码中添加了一行以显示如何使用输入(即使此时编辑是无意义的)。 如果有任何不清楚的地方,请告诉我。

编辑:我已更改此示例,以便滑块值实际过滤进入绘图的数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM