Может ли R Shiny отображать разные виды для двух одновременно работающих пользователей, взаимодействующих друг с другом? - PullRequest
0 голосов
/ 05 июня 2019

Обычно сервер Shiny порождает отдельные экземпляры для отдельных пользователей, так что несколько человек могут по отдельности использовать одно и то же приложение одновременно. Этот ответ показывает, как создать простую многопользовательскую чат-комнату, используя Shiny, а этот ответ объясняет, как несколько пользователей могут подключаться к одному сеансу через прямой IP. Я получил пример чата, и два пользователя сразу видят сообщения сразу после их отправки и могут общаться друг с другом.

Мне интересно, возможно ли вообще использовать Shiny для (экспериментального) сценария, когда два пользователя, взаимодействуя друг с другом, увидели бы различных элементов графического интерфейса на соответствующих экранах и различный вывод В зависимости от того, чья очередь «играть». Например, если user1 является «начинающим игроком», он увидит три кнопки и нажмет одну из них, появится соответствующее изображение для user2 (не для user1), user2 нажимает кнопку (которая, по его мнению, соответствует изображению), а затем появляется соответствующее изображение для пользователя user1, и пользователь1 нажимает кнопку «правильно» / «неправильно», чтобы отправить отзыв; они не должны видеть, кто нажимает на какую кнопку, ни изображение, которое видит другой (если на самом деле сложно скрыть элементы GUI, то их прерывание / прерывистое отключение также хорошо, если они не видят того, что делает другой).

Или более наглядно:

round 1
user1                   user2
director                guesser

what they see, step by step:
1. [three buttons]      [ (blank) ]
2. [clicks one]         [ ]
3  [ ]                  [sees an image & 3 buttons]
4. [ ]                  [clicks a button]
5. [sees image,2 butns] [ ]
6. [clicks button]      [ ]
7. [ ]                  [sees the message "correct" or "incorrect"]

round 2
user1                   user2
guesser                 director
1. [ ]                  [three buttons]
...
...

И в следующем раунде они меняются ролями и так далее на несколько раундов.

Я видел похожие экспериментальные сценарии, реализованные с использованием Javascript (jsPsych, nodegame) и Python (psychopy, oTree), но я пытаюсь понять, возможно ли это сделать в Shiny, и если да, то как.

1 Ответ

1 голос
/ 05 июня 2019

У меня была такая же проблема пару лет назад, когда я реализовал «Риск» (настольную игру) в виде блестящего приложения.

Краткое описание того, как я подошел к нему тогда:

Если вы используете параметр 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...