R Shiny 能否为两个同时进行交互的用户显示不同的视图?

2023-11-30

通常,Shiny 服务器会为各个用户生成单独的实例,以便多个人可以同时单独使用同一个应用程序。这个答案展示如何使用 Shiny 制作一个简单的多用户聊天室,以及这个答案解释了多个用户如何通过直接 IP 连接到同一会话。我让聊天示例正常工作,两个用户在发送消息时都会立即看到消息,因此可以互相聊天。

我想知道是否有可能将 Shiny 用于(实验)场景,其中两个用户相互交互,会看到不同的GUI 元素在各自的屏幕上,以及不同的输出,具体取决于轮到谁“玩”。例如,如果用户1是“起始玩家”,他会看到三个按钮并单击其中一个,将为用户2弹出一个相关图像(不是用户1),用户2单击一个按钮(他认为与图像匹配),然后弹出user1的相关图片,user1点击“正确”/“不正确”按钮发送反馈;他们不应该看到谁点击了哪个按钮,也不应该看到另一个人看到的图像(如果实际上隐藏 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 中实现,如果可以,如何实现。


几年前,当我将“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)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

R Shiny 能否为两个同时进行交互的用户显示不同的视图? 的相关文章

  • R data.table:在当前测量之前对出现次数进行计数

    我有一组在几天内进行的测量结果 测量次数通常为 4 任何测量中可以捕获的数字范围为 1 5 在现实生活中 给定测试集 范围可能高达 100 或低至 20 我想每天计算每个值在当天之前发生的次数 让我用一些示例数据来解释 test data
  • rle 命令帮助

    我在使用 rle 命令时遇到了一些麻烦 该命令旨在找到参与者连续达到 8 个连续参与者的点 例如 如果 x lt c 0 1 0 1 1 1 1 1 1 1 1 1 我想返回值 11 感谢 DWin 我一直在使用这段代码 which rle
  • R - 对矩阵的每行/列应用具有不同参数值的函数

    我试图将函数应用于矩阵的每一行或每一列 但我需要为每一行传递不同的参数值 我以为我熟悉 lapply mapply 等 但可能还不够 举个简单的例子 gt a lt matrix 1 100 ncol 10 gt a 1 2 3 4 5 6
  • 按元素名称组合/合并列表

    我有两个列表 其元素的名称部分重叠 我需要将其逐个元素合并 组合成一个列表 gt lst1 lt list integers c 1 7 letters letters 1 5 words c two strings gt lst2 lt
  • ggplot多个时间不等的时间序列

    我知道有一些与时间序列和多个数据帧相关的已回答问题 但我似乎无法弄清楚这一点 我想绘制 4 个不同压力传感器与时间的时间戳数据 pa 列 我有来自同一实验的 4 个带时间戳的压力读数 dfs 然而 由于传感器故障和数据中的其他信号 传感器收
  • 滚动最小值,固定起点[重复]

    这个问题在这里已经有答案了 好的 我想计算数据框中的滚动最小值 向下滚动列 到目前为止 我无法确定该系列的起点并滚动到结尾 我努力了 mins lt c 10 5 6 10 6 6 7 8 2 12 roll min expected lt
  • Java GUI,根据actionListener更改面板

    我在两个不同的面板中添加了两个按钮 如果单击第一个按钮 则需要转到下一个面板 其中包含第二个按钮 但是当我单击第一个按钮时 该按钮没有被替换 Java GUI import java awt event ActionEvent import
  • TextView 中缩进项目符号列表

    我有一个 TextView 我用 strings xml 中的字符串资源中的文本填充它 字符串资源包含 元素 用于在 TextView 内创建项目符号列表 我的问题是我想控制项目符号列表中跨越多行的行的缩进 默认情况下 文本不会缩进超过项目
  • 在 R 中绘制 3D 数据

    我有一个 3D 数据集 data data frame x rep c 0 1 0 2 0 3 0 4 0 5 each 5 y rep c 1 2 3 4 5 5 data z runif 25 min data x data y 0 1
  • 如何创建具有特定于每个方面的标题和副标题的分面图?

    生成一个图 该图与每列的单独图相结合 带有标题和副标题 以及每个图的垂直线 我使用直方图创建了带有垂直线的列 library ggplot2 library gridExtra library tidyr actualIris lt dat
  • 在水平条形图中绘制连续分布

    这是我之前的question https stackoverflow com questions 71318781 multiple variable distribution plot using ggplot2使用多重分布解决了这个问题
  • 在 Rdata 中保存矩阵并更新 Rdata 文件

    我有一个矩阵 mat lt matrix data 1 30 ncol 10 nrow 3 我想将其保存到 Rdata save mat file m Rdata 然后加载回来 m lt load m Rdata 然后看看它的内容 m 1
  • R dbGetQuery 与动态字符串

    From 这个帖子 https stackoverflow com questions 3416973 dynamic string in r and 这个帖子 https stackoverflow com questions 34496
  • R 中 bquote 中的拼接

    假设我正在使用 R 的反引号运算符构建一个表达式bquote 并且我想在列表中的特定位置 拼接 即丢失列表的外括号 例如 我有表达式 5 4 我想在其开头添加 6 而不使用字符串操作 即完全对符号结构进行操作 So gt b quote 5
  • 在动画 ggplot2 中的轴标签上包含图像

    我创建了一个动画条形图 显示玩家的进球数 虚构 请参阅示例的复制数据 df lt data frame Player rep c Aguero Salah Aubameyang Kane 6 Team rep c ManCity Liver
  • 读取 csv 文件时出错

    我有一个 xlsx 文件 为了从 Rstudio 读取 我将其保存为 csv 文件 现在 当我尝试从 Rstudio 读取文件时 收到以下错误 setwd D DATA SCIENCE CCPP Linear regression ccpp
  • R:动态创建变量名

    我正在寻找使用 for 循环创建多个数据帧 然后将它们缝合在一起merge 我可以使用创建我的数据框assign paste blah 但是 在同一个 for 循环中 我需要删除每个数据帧的第一列 这是我的代码的相关部分 for j in
  • 如何为ggplot中的每个方面行添加y轴标题?

    我正在做一个散点图facet grid 像那样 library ggplot2 ggplot df aes x y geom point facet grid group1 group2 我想要 y 轴标题y像这样位于每一行的中间 绘制解决
  • 如何在R中生成多个矩阵

    我在 R 中得到了两个值列表 daily max car List 1 21 21 22 22 22 22 21 daily 0 8 List 2 16 17 17 17 18 17 17 尝试在 R Studio 中编写一个 For 循环
  • 在 kivy 中嵌套小部件

    我正在尝试在 kivy 中制作一个界面 我认为即使在完成教程之后 我仍然不了解自定义小部件以及如何对它们进行层次结构的一些基本知识 我认为我有更多的盒模型 html 思维方式 因此小部件嵌套在本机 GUI 中的方式对我来说仍然有点陌生 一些

随机推荐