[英]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)
關鍵點是使用renderUI
和uiOutput
將計算轉移到服務器端。 我還在數字圖形代碼中添加了一行以顯示如何使用輸入(即使此時編輯是無意義的)。 如果有任何不清楚的地方,請告訴我。
編輯:我已更改此示例,以便滑塊值實際過濾進入繪圖的數據。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.