几年前,当我将“Risk”(棋盘游戏)实现为一个闪亮的应用程序时,我遇到了同样的挑战。
快速概述一下我当时的做法:
如果您使用session
服务器函数中的参数,可以创建本地/秘密reactiveValue()
在该会话内/该用户。
接下来可以设置reactiveValues()
在可跨会话访问的“全局信息”服务器功能之外。
后一种方法可能更令人惊讶,因为我们通常“被迫”定义reactive
服务器功能内的行为。但它确实有效,请参阅下面的示例。
可重现的例子:
library(shiny)
ui <- fluidPage({
uiOutput("moreControls")
})
global <- reactiveValues(info = "public info: I can be seen by everyone", amountUser = 0, userIdToPlay = 1)
server <- function(input, output, session) {
local <- reactiveValues(secret = paste0("My secret number is ", sample(6, 1)))
observe({
isolate(global$amountUser <- global$amountUser + 1)
isolate(local$userId <- global$amountUser)
})
observeEvent(input$finish,{
global$userIdToPlay <- 3 - global$userIdToPlay # assumes two players (for MVE)
})
output$moreControls <- renderUI({
global$userIdToPlay
isolate({
if(local$userId == global$userIdToPlay){
return(
tagList(
h2("my time to play"),
selectInput("a", "b", letters),
actionButton("finish", "finish")
)
)
}else{
return(
h2("not my time to play")
)
}
})
})
}
shinyApp(ui, server)