2017-10-12 47 views
0

作为了解Shiny的一种方式,我正在为多个玩家开发一个小型游戏。如何更新闪亮的复选框GroupInput

我导入CSV取回我的合格玩家(players.csv),还包括与TextInput和actionButton标签随着时间的推移逐步增加其他符合条件的球员。

我的下一步是从这些符合条件的玩家中选择那些想玩特定游戏的玩家。我在随后的tabPanel上将此功能作为checkboxGroupInput提供。在这个查询中,我还没有考虑过在这个时候使用玩家或者甚至是游戏。

但是,我的问题是,如果我在第一步添加新玩家,我似乎无法更新checkboxGroupInput选项来反映我刚刚在第一步中添加的任何玩家。

为免生疑问的...

  • 设置自己的(类似)FILE_PATH写players.csv到文件
  • 运行应用程序和“add_a_player”和“play_game”选项卡之间切换
  • 你可以看到4名如前所述合格玩家(“约翰福音”,“禄”,“乔治”,“环”)从players.csv阅读
  • 通过“add_a_player”选项卡,然后按提交添加一个新的播放器(新玩家被附加到players.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) 
+0

您可以使用'renderUI()'和'uiOutput()'函数将任何通用的'R'代码移动到您的'server.R'中。因此,例如,如果您引用您的'actionbutton()' –

+0

thnx @Michael Bird,您可以将您的播放器.csv的读数移动到您的'renderUI()'中以实时完成。我将在稍后探讨这条道路。 :) – CallumH

回答

1

您可以使用updateCheckboxGroupInput如下:

server = function(input, output,session){ 

     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) 
     updateCheckboxGroupInput(session, inputId = "add_players", 
           choices = read.table(paste0(file_path, "players.csv"), header = T, stringsAsFactors = F, sep = ",")$player) 

     })} 

但由于每次添加一个播放器的时间阅读csv文件是不是一个好主意,你也可以使用reactiveValues如下:

server = function(input, output,session){ 
     Allplayers=reactiveValues(Val = read_in_players) 

     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) 
     Allplayers$Val <- c(Allplayers$Val,players()) 
     updateCheckboxGroupInput(session, inputId = "add_players", choices = Allplayers$Val) 

     })} 
+0

Thnx @SBista。两人都做了这份工作。我得到了类似updateCheckboxGroupInput的地方,但我有probs传递/不通过'会话',我通常不会将其作为参数添加。 – CallumH