簡體   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