基于dplyr发光的反应对象隔离功能

时间:2016-04-08 16:02:11

标签: r shiny

我创建了一个简单的闪亮应用。目标是创建一个histogram,其中包含操作每个数据集的绘图的选项。问题是,当我更改数据集应用程序时,首先显示空图,然后显示正确的图。为了解问题,我添加了renderText,其中显示了getDataParams数据集中的多个行。在我看来,isolate函数应该是一个解决方案,但我尝试了几种配置,显然我仍然不理解这个功能。

library(lazyeval)
library(dplyr)
library(shiny)
library(ggplot2)

data(iris)
data(diamonds)

ui <- fluidPage(
      column(3,
             selectInput("data", "", choices = c('', 'iris', 'diamonds')),
             uiOutput('server_cols'),
             uiOutput("server_cols_fact"),
             uiOutput("server_params")
      ),
      column(9,
             plotOutput("plot"),
             textOutput('text')

      )
)

server <- function(input, output) {
      data <- reactive({
            switch(input$data, diamonds = diamonds, iris = iris)
      })

      output$server_cols <- renderUI({
            validate(need(input$data != "", "Firstly select a dataset."))
            data <- data()
            nam <- colnames(data)
            selectInput('cols', "Choose numeric columns:", choices = nam[sapply(data, function(x) is.numeric(x))])
      })

      output$server_cols_fact <- renderUI({

            req(input$data)

            data <- data(); nam <- colnames(data)
            selectizeInput('cols_fact', "Choose a fill columns:",
                           choices = nam[sapply(data, function(x) is.factor(x))])
      })

      output$server_params <- renderUI({

            req(input$cols_fact)

            data <- isolate(data()); col_nam <- input$cols_fact
            params_vec <- unique(as.character(data[[col_nam]]))
            selectizeInput('params', "Choose arguments of fill columns:", choices = params_vec,
                           selected = params_vec, multiple = TRUE)

      })

      getDataParams <- reactive({

            df <- isolate(data())
            factor_col <- input$cols_fact
            col_diverse <- eval(factor_col)

            criteria <- interp(~col_diverse %in% input$params, col_diverse = as.name(col_diverse))
            df <- df %>%
                  filter_(criteria) %>%
                  mutate_each_(funs(factor), factor_col)
      })

      output$text <- renderText({
            if(!is.null(input$cols)) {
                  print(nrow(getDataParams()))
            }
      })
      output$plot <- renderPlot({
            if (!is.null(input$cols)) {

                  var <- eval(input$cols)
                  print('1')

                  diversifyData <- getDataParams()
                  factor_col <- input$cols_fact
                  print('2')

                  plot <- ggplot(diversifyData, aes_string(var, fill = diversifyData[[factor_col]])) +
                        geom_histogram(color = 'white', binwidth = 1)

                  print('3')
            }
            plot

      })

}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:0)

为了最好地解释流程 - 我创建了一张图片,解释了如何刷新绘图如下:

  • 因此,如果没有隔离代码,您对代码上任何控件的任何更改都会发生任何更改,将触发箭头末尾控件的更改。在这种情况下,最终结果是情节刷新5次。
  • 使用上面帖子中的代码中的隔离代码,您已经消除了两个小箭头。
  • 为避免您在选择填充列时提到的情况,您需要通过隔离input$cols_fact被动output$plot <- renderPlot{...}中的stdClass来消除我突出显示的大箭头。 / LI>
  • 使用此选项时,您仍然可以在选择数据表时刷新两次,但我认为可以接受,因为当您执行选择数字列
  • 时需要重新激活图表

希望这回答你的问题!和Shiny一起玩很开心!

enter image description here