【问题标题】:Order of execution in ggvis and reactive slider input shinyggvis 中的执行顺序和反应式滑块输入闪亮
【发布时间】: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)

【问题讨论】:

    标签: r shiny ggvis


    【解决方案1】:

    在反应式绘图命令中放置 invalidateLater 1 秒将使渲染器等待滑块重新初始化。我还将Sys.sleep 更改为更短的时间,因此重新绘制延迟几乎察觉不到

    # note the added 'session' argument
    server <- function(input, output, session) {
    
      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({
    
       invalidateLater(1000, session)
    
        withProgress('', value = 0, {
          y_min <- input$value[1]
          y_max <- input$value[2]
    
          plot <- isolate(data()) %>% 
            ggvis(~id, ~value) %>% 
            layer_points() %>% 
            scale_numeric('y', domain = c(y_min, y_max))
    
            Sys.sleep(0.01)
        })
        return(plot)
      })
    
      plot %>% bind_shiny('plot_show')
    
    }
    

    【讨论】:

    • 我使用 Sys.sleep() 只是为了呈现问题(为了更明显)。此外,这太棒了!我不知道该功能。谢谢!
    • 哎呀,isolate(data()) 是必需的,其他的不是。它阻止情节评估嵌套在data_0 中的input$prod 的变化,而是对input$value 变化作出反应。
    • 似乎 withProgress 也是不必要的,因为它会导致加载永无止境的循环。
    猜你喜欢
    • 2021-12-06
    • 2015-06-23
    • 2016-02-22
    • 1970-01-01
    • 2018-03-07
    • 2016-04-09
    • 1970-01-01
    • 2023-04-01
    • 2023-02-15
    相关资源
    最近更新 更多