我想知道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时,全局未更新......
答案 0 :(得分:4)
您可以从观察者或observeEvents更新reactiveValue。任何依赖于该值的反应式表达式都将失效,并在必要时进行更新。
全局变量是一个全局定义的变量,即处于闪亮App的过程中的所有用户共享该变量。最简单的例子是大型数据集。
请注意,您的“全局”变量不是全局变量。您可以将其定义为:
global <- list()
在服务器内。因此,它对您应用中的一个用户来说是唯一的,不会共享。即如果它是
global <- runif(1)
“全局”中的数字对于多个用户会有所不同。如果希望值相同,则应将其初始化为服务器定义之上。还要注意这一行:
global <- creerCube(input)
不会修改“全局”变量,因为它超出了范围。它在观察者中创建一个变量“global”,并在函数完成时将其丢弃。最好的方法是将global设置为reactiveValue:
global <- reactiveVal()
然后将其更新为:
global(creerCube(input))
我希望这会有所帮助。