【发布时间】:2016-01-07 18:53:28
【问题描述】:
我用一个反应式小部件sliderInput 创建了一个非常简单的闪亮应用程序。该解决方案允许我操纵 y 轴的比例。但是当我将滑块设置在 0 和 0.3 之间时,然后我更改了产品,例如P1->P3 sliderInput 小部件自动返回到原始范围(即 0 和 1)。应用程序工作正常,但我注意到当我更改具有操纵范围的产品时,第一步是绘制一个操纵 y 轴的图,然后该图包括 y 轴的原始范围。它看起来很丑,尤其是在更复杂的应用程序中。如何更改执行顺序,即首先更改 y 轴的范围,然后生成绘图?
global.R
library(dplyr)
prod <- c('P1','P2','P3')
level <- c('L1','L2','L3')
part <- c('p1','p2','p3','p4','p5')
set.seed(123)
module1_df <- data.frame(prod = sample(prod,300, replace = T),
value = runif(300,0,0.3))
module1_df <- as.data.frame(module1_df %>%
group_by(prod) %>%
mutate(id = 1:n()) %>%
arrange(prod, id))
app.R
library(shiny)
library(ggvis)
ui <- navbarPage(
title = '',
tabPanel("Module 1",
selectInput('prod', '', prod),
uiOutput('in_value'),
ggvisOutput('plot_show')
)
)
)
server <- (function(input, output) {
data_0 <- reactive({
df <- module1_df %>%
filter(prod == input$prod)
})
output$in_value <- renderUI({
df2 <- data_0()
var <- 'value'
min_value <- min(df2[,var])
sliderInput('value','',min = round(min_value,0),
max = 1, value = c(0,1), step = 0.1)
})
data <- reactive({
df3 <- data_0()
if (!is.null(input$value)) {
df3 <- df3 %>%
filter(df3[['value']] >= input$value[1] &
df3[['value']] <= input$value[2])
}
return(df3)
})
plot <- reactive({
withProgress('', value = 0, {
y_min <- input$value[1]
y_max <- input$value[2]
plot <- data() %>%
ggvis(~id, ~value) %>%
layer_points() %>%
scale_numeric('y',domain = c(y_min, y_max))
Sys.sleep(0.5)
})
return(plot)
})
plot %>% bind_shiny('plot_show')
})
shinyApp(ui = ui, server = server)
【问题讨论】: