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

时间:2017-09-25 14:57:56

标签: r ggplot2 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))
}
})
}

现在,我如何添加滑块来过滤数字输入?

我是新学员,请帮助我。 非常感谢你

1 个答案:

答案 0 :(得分:1)

对不起,我没有时间将这个演示充实为一个更好的例子,但希望这会向你展示方法论:

<div *ngIf="selectedHero">
    <h2>Details of {{selectedHero.name}}</h2>
    <div><label>Id: </label>{{selectedHero.id}}</div>
    <div>
        <label>Name: </label>
        <input [(ngModel)]="selectedHero.name"/>
    </div>
</div>

关键点是使用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) renderUI将计算移动到服务器端。我还在数字图形代码中添加了一行来显示如何使用输入(即使此时编辑是荒谬的)。如果有什么不清楚,请告诉我。

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