【问题标题】:Remove reactive expression in shiny app删除闪亮应用程序中的反应式表达
【发布时间】:2015-06-02 13:35:21
【问题描述】:

我的应用程序可以很好地处理反应式表达式,但速度很慢。 我有两个功能:

  • FixData 清理和修复我的数据(超过 50 万行),这个功能很慢

  • PlotData,它返回一个 ggplot 图并且相当快

我首先要做的是导入我的文件并在不使用“reactive({})”的情况下修复我的数据,例如我的数据将被命名为“mydata”。 其次,我用反应式表达式过滤和表示“my.data”。 我想要的是把我的数据保存在内存中,不要像我现在的程序那样改变它。

shinyServer(function(input, output) {

#   observe({


  cp <- reactive({

    inFile <- input$file1

    if (is.null(inFile))
      return(NULL)

    read.delim(inFile$datapath, header = TRUE,
               sep = "\t",stringsAsFactors=FALSE)
  })

  up <- reactive({

    inFile <- input$file2

    if (is.null(inFile))
      return(NULL)

    read.delim(inFile$datapath, header = TRUE,
               sep = "\t",stringsAsFactors=FALSE)
  })

  tac <- reactive({

    inFile <- input$file3

    if (is.null(inFile))
      return(NULL)

    read.delim(inFile$datapath, header = TRUE,
               sep = "\t",stringsAsFactors=FALSE)
  })




    GetData <- reactive({
      my.data <- FixData(data.cp = cp(), data.up = up(), data.tac = tac())

      ifelse(input$case1 == TRUE & input$case2 == FALSE,
             my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
                                  my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ],
             ifelse(input$case2 == TRUE & input$case1 == FALSE,
                    my.data <- my.data[my.data$TYPE_DE_TERMINAL %in% terminal &
                                         my.data$CONSTRUCTEUR %in% input$manufacturer, ],
                    ifelse(input$case1 == TRUE & input$case2 == TRUE,
                           my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
                                              my.data$TYPE_DE_TERMINAL %in% terminal, ],
                           my.data <- my.data[my.data$CONSTRUCTEUR %in% input$manufacturer & 
                                                my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ]
                           )))
      if(input$lte == TRUE){
        my.data <- my.data[my.data$LTE == "Oui", ]
      }

      ifelse(input$case3 == TRUE,
             my.data <- my.data[my.data$Cause %in% cause, ],
             my.data <- my.data[my.data$Cause %in% input$pb, ]                   
             )

      my.data

      })



    GetData2 <- reactive({


      if (input$compare == "yes"){

        cp2 <- reactive({

          inFile <- input$file4

          if (is.null(inFile))
            return(NULL)

          read.delim(inFile$datapath, header = TRUE,
                     sep = "\t",stringsAsFactors=FALSE)
        })

        up2 <- reactive({

          inFile <- input$file5

          if (is.null(inFile))
            return(NULL)

          read.delim(inFile$datapath, header = TRUE,
                     sep = "\t",stringsAsFactors=FALSE)
        })




      my.data <- FixData(data.cp = cp2(), data.up = up2(), data.tac = tac())

      ifelse(input$case1 == TRUE & input$case2 == FALSE,
             my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
                                  my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ],
             ifelse(input$case2 == TRUE & input$case1 == FALSE,
                    my.data <- my.data[my.data$TYPE_DE_TERMINAL %in% terminal &
                                         my.data$CONSTRUCTEUR %in% input$manufacturer, ],
                    ifelse(input$case1 == TRUE & input$case2 == TRUE,
                           my.data <- my.data[my.data$CONSTRUCTEUR %in% manufacturer &
                                                my.data$TYPE_DE_TERMINAL %in% terminal, ],
                           my.data <- my.data[my.data$CONSTRUCTEUR %in% input$manufacturer & 
                                                my.data$TYPE_DE_TERMINAL %in% input$terminal.type, ]
                    )))
      if(input$lte == TRUE){
        my.data <- my.data[my.data$LTE == "Oui", ]
      }

      ifelse(input$case3 == TRUE,
             my.data <- my.data[my.data$Cause %in% cause, ],
             my.data <- my.data[my.data$Cause %in% input$pb, ]                   
      )

      my.data
      }  
    })

   observe({

   if(input$compare == "no"){

     output$myChart1 <- renderPlot({

       my.plot <- PlotDataManBis(GetData(), 
                              var = input$variable)
       my.plot

     })

     output$myChart2 <- renderPlot({

       my.plot <- PlotDataTypeBis(GetData(), 
                               var = input$variable)
       my.plot

     })

     output$myChart3 <- renderPlot({

       my.plot <- PlotDataCauseBis(GetData(), 
                                var = input$variable)
       my.plot

     })

     output$resume <- renderDataTable({

       my.data2 <- GetData()
       my.data2
     },
     options = list(bSortClasses = TRUE, iDisplayLength = 10,
                    aLengthMenu = list(c(5, 10, -1), c('5', '10', 'All'),
                                       aoColumnDefs = list(list(sWidth=c("100px"),
                                                                aTargets=list(0)))

                    ))
     )

   }else{


    output$myChart1 <- renderPlot({

      my.plot <- PlotDataMan(GetData(), GetData2(),
                             var = input$variable)
      my.plot

    })

  output$myChart2 <- renderPlot({

    my.plot <- PlotDataType(GetData(), GetData2(),
                            var = input$variable)
    my.plot

  })

  output$myChart3 <- renderPlot({

    my.plot <- PlotDataCause(GetData(), GetData2(),
                           var = input$variable)
    my.plot

  })

  output$resume <- renderDataTable({

    my.data2 <- GetData()
    my.data2
  },
  options = list(bSortClasses = TRUE, iDisplayLength = 10,
                 aLengthMenu = list(c(5, 10, -1), c('5', '10', 'All'),
                                    aoColumnDefs = list(list(sWidth=c("100px"),
                                                             aTargets=list(0)))

                 ))
  )}})
  #   })  
})

谢谢, 莫斯

【问题讨论】:

  • 您只需执行df &lt;- read.delim("some file") 并在整个应用程序中访问它。你不需要把它放在响应式中。
  • 你能更明确一点吗,因为我必须为 ui.r 界面保留 infile ?我很不安,我总是使用反应式表达......谢谢
  • 据我所知,如果必须使用“输入”变量,则必须在反应式上下文中完成。

标签: r shiny


【解决方案1】:

这个页面应该可以帮助你https://gist.github.com/wch/9606002。基本上,如果您在文件中放置actionButton,则可以在文件输入周围放置isolate 括号,这样每次输入更改时数据都不会更改。查看该页面以了解更多错综复杂的信息,但基本上您将在用户输入文件的位置旁边有一个actionButton,并指示该按钮使用该新数据重新运行应用程序。然后在您的 server.R 中,将 input$nameofyouractionButton 作为导入和修复数据的反应表达式中的第一行,然后将 isolate() 放置在反应表达式的其余部分周围。希望对您有所帮助!

【讨论】:

  • 谢谢,我用的是submitButton,不知道这个!我正在尝试并回复你:)
猜你喜欢
  • 1970-01-01
  • 2022-10-31
  • 1970-01-01
  • 2018-12-29
  • 1970-01-01
  • 2014-10-04
  • 2016-04-21
  • 1970-01-01
  • 2018-06-04
相关资源
最近更新 更多