全局变量和无功值之间的差异

时间:2017-08-03 09:57:49

标签: r shiny

我想知道reactiveValue和全局变量之间有什么区别。

我无法找到正确的答案:/我在以下脚本中遇到了问题:

shinyServer(function(input, output, session) {
  global <- list()
  observe({
    updateSelectInput(session, "choixDim", choices = param[name == input$choixCube, dim][[1]])
    updateSelectInput(session, "choixMes", choices = param[name == input$choixCube, mes][[1]])
  })

  output$ajoutColonneUi <- renderUI({
    tagList(
      if(input$ajoutColonne != "Aucun"){
        textInput("nomCol", "Nom de la colonne créée")
      },
      switch(input$ajoutColonne,
             "Ratio de deux colonnes" = tagList(
               selectInput("col1", label = "Colonne 1", choices = input$choixMes),
               selectInput("col2", label = "Colonne 2", choices = input$choixMes)
             ),
             "Indice base 100" = selectInput("col", label = "Colonne", choices = input$choixMes),
             "Evolution" = selectInput("col", label = "Colonne", choices = input$choixMes)
      )
    )
  })

  observeEvent(input$chargerCube,{
    debutChargement()
    global <- creerCube(input)
    global <- ajouterColonne(global, input)
    finChargement()

    if(!is.null(global)){
      cat('Cube chargé avec succés ! \n')
      output$handlerExport <- downloadHandler(
        filename = function(){
          paste0("cube_generated_with_shiny_app",Sys.Date(),".csv")
        },
        content = function(file){
          fwrite(global$cube, file, row.names = FALSE)
        }
      )
      output$boutons <- renderUI({
        tagList(
          downloadButton("handlerExport", label = "Exporter le cube"),
          actionButton("butValider", "Rafraichir la table/le graphique")
        )
      })
    }
  })

  observeEvent(input$butValider,{
    output$pivotTable <- renderRpivotTable({
      cat('test')
      rpivotTable(data = global$cube, aggregatorName = "Sum", vals = global$mes[1], cols = global$temp)
    })
  })

})
当我想从这些数据中显示rpivotTable时,

全局未更新......

1 个答案:

答案 0 :(得分:4)

您可以从观察者或observeEvents更新reactiveValue。任何依赖于该值的反应式表达式都将失效,并在必要时进行更新。

全局变量是一个全局定义的变量,即处于闪亮App的过程中的所有用户共享该变量。最简单的例子是大型数据集。

请注意,您的“全局”变量不是全局变量。您可以将其定义为:

global <- list()

在服务器内。因此,它对您应用中的一个用户来说是唯一的,不会共享。即如果它是

global <- runif(1)

“全局”中的数字对于多个用户会有所不同。如果希望值相同,则应将其初始化为服务器定义之上。还要注意这一行:

global <- creerCube(input)

不会修改“全局”变量,因为它超出了范围。它在观察者中创建一个变量“global”,并在函数完成时将其丢弃。最好的方法是将global设置为reactiveValue:

global <- reactiveVal()

然后将其更新为:

 global(creerCube(input))

我希望这会有所帮助。