【发布时间】:2017-10-12 11:23:07
【问题描述】:
作为理解 Shiny 的一种方式,我正在为多个玩家开发一款小游戏。
我导入一个 csv 来检索我的符合条件的玩家 (players.csv),还包括一个带有 textInput 和 actionButton 的选项卡,以便随着时间的推移逐步添加其他符合条件的玩家。
我的下一步是从这些符合条件的玩家中选择想要玩给定游戏的玩家。我在后续的 tabPanel 上将这个功能作为 checkboxGroupInput 提供。在这个查询中,我还没有考虑过使用玩家,或者实际上是游戏。
然而,我的问题是,如果我在第一步中添加一个新玩家,我似乎无法更新 checkboxGroupInput 选项以反映我在第一步中刚刚添加的任何玩家。
为免生疑问...
- 设置您自己的(类似)file_path 以将 player.csv 写入文件
- 运行应用并在“add_a_player”和“play_game”标签之间切换
- 您可以看到从 player.csv 读取的 4 位先前声明的合格玩家(“john”、“paul”、“george”、“ringo”)
- 通过“add_a_player”选项卡添加新玩家并按提交(新玩家附加到 player.csv)
- 返回“play_game”标签,仍然只有 4 个玩家
问题 - 我如何强制 checkboxGroupInput 也显示我刚刚添加的新玩家?
我尝试了各种不同的解决方案,但没有取得多大成功,包括尝试使用 updateCheckboxGroupInput 或通过 conditionalPanel。
这是我的工作代码,非常感谢您的意见。 :)
library(shiny)
########################## SETUP
file_path = "C:/Users/Callum Hollywood/Desktop/"
write.table(data.frame(player = c("john", "paul", "george", "ringo")),
paste0(file_path, "players.csv"),
col.names = T,
row.names = F,
sep = ",")
read_in_players = read.table(paste0(file_path, "players.csv"), header = T, stringsAsFactors = F, sep = ",")$player
########################## UI
ui = fluidPage(
navlistPanel(
tabPanel("add_a_player",
"add a player to the list of eligible players",
textInput("addplayer", ""),
actionButton("submit", "SUBMIT")
),
tabPanel("play_game",
checkboxGroupInput(inputId = "add_players",
label = "add players to a current game",
choices = read_in_players))))
########################## SERVER
server = function(input, output){
players = eventReactive(input$submit,{input$addplayer})
observeEvent(input$submit,{
write.table(players(), paste0(file_path, "players.csv"), col.names = F, row.names = F, sep = ",", append = T)
})}
shinyApp(ui, server)
【问题讨论】:
-
您可以使用
renderUI()和uiOutput()函数对将 UI 元素所需的任何通用R代码移动到server.R。因此,例如,如果您引用您的actionbutton(),您可以将播放器 .csv 的读数移动到您的renderUI()中,以便实时完成 -
谢谢@Michael Bird。稍后我将进一步探索这条途径。 :)