2017-10-12 40 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