【问题标题】:Shiny: observe change in global variableShiny:观察全局变量的变化
【发布时间】:2019-02-16 08:56:42
【问题描述】:

我正在 Shiny 中制作一个非常简单的游戏。基本上每个玩家都在自己的会话中玩,但他们共享 1 个全局变量来跟踪每个玩家的得分。

我认为我成功地让会话更新了全局“分数”变量,但由于某些(可能是愚蠢的)原因,我无法让全局变量充当反应值(即自动触发 updateActionButton)。下面的最小代码:

工作示例:

score <- c(100) 

ui <- fluidPage(
  titlePanel("Hello Shiny!"),
  mainPanel(
    actionButton("increase_score", label = " increase score player 1 "),
    verbatimTextOutput("show_score_p1")
  )
)

# Server logic
server <- function(input, output){
  observeEvent(input$increase_score,{
    score[1] <- score[1]+10
  })
  output$show_score_p1 <- renderText({paste(score[1])})  
}

shinyApp(ui,server)

我尝试了几种方法来尝试使我的全局“分数”具有反应性,即 makeReactiveBinding(score),但无济于事。有任何想法吗?绝对感觉我错过了一些非常明显的东西

【问题讨论】:

标签: r scope shiny global shiny-reactivity


【解决方案1】:

使用可以使用名为reactiveValues的有用函数

library(shiny)
ui <- fluidPage(
  titlePanel("Hello Shiny!"),
  mainPanel(
    actionButton("increase_score", label = " increase score player 1 "),
    verbatimTextOutput("show_score_p1")
  )
)

score<-reactiveValues(a=100)
# Server logic
server <- function(input, output){

  observeEvent(input$increase_score,{
    score$a <- score$a+10
  })
  output$show_score_p1 <- renderText({
    score$a
  })  
}

shinyApp(ui,server)

【讨论】:

  • 嗨吉姆,感谢您的回复!我认为'reactiveValues'在这里没有帮助,因为这只会创建我的全局变量的会话相关(反应性)副本,对吗?我的目标是,一旦一个会话更新了“分数”变量,所有其他会话也应该能够看到它
  • 抱歉误解了你的意思。如果您希望score 与多个会话反应,您只需将score&lt;-reactiveValues(a=100) 移出到server。查看修改后的代码,它与多个会话完美配合。一个会话点击按钮,所有会话都会看到score变化。
猜你喜欢
  • 2021-01-26
  • 1970-01-01
  • 2016-09-29
  • 1970-01-01
  • 2014-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-10
相关资源
最近更新 更多