【问题标题】:R-shiny: How to add a slider to filter the numeric input?R-shiny:如何添加滑块来过滤数字输入?
【发布时间】:2017-09-25 14:57:56
【问题描述】:

所以我正在使用 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))
}
})
}

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

我是新手,请帮帮我。 非常感谢

【问题讨论】:

  • mgp 数据集只有数字数据:例如sapply(mpg, class)
  • 我知道了,现在我想在闪亮的应用程序中创建一个滑块来过滤这些数字数据,如何?
  • 你希望每个滑块都有这个,对于 var1 和 var2 意味着什么?
  • 是的,我想为 var1 和 var2 添加滑块......
  • 您可以使用uiOutputrenderUI 函数对从server.R 中创建反应式UI 元素,以在ui.R 中呈现。这样做的好处是 server.R 能够执行任意 R 代码(例如选择 input$var1 )以设置为在 renderUI 中调用的 sliderInput 函数的参数。

标签: r ggplot2 shiny


【解决方案1】:

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

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

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

【讨论】:

  • 非常感谢!你能告诉我如何让 var2 在 selectInput 中只选择字符变量吗? var1 没有改变。
  • 嗨@GaryGuo,我已经更改了第二个selectInput 中的choices 参数,使其仅显示字符变量。
  • 哦,非常感谢您帮助我。
猜你喜欢
  • 2016-11-06
  • 2016-06-03
  • 2017-01-03
  • 2015-10-16
  • 1970-01-01
  • 2023-03-03
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多