【问题标题】:How to Update a Shiny checkboxGroupInput如何更新闪亮的复选框GroupInput
【发布时间】: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。稍后我将进一步探索这条途径。 :)

标签: r shiny


【解决方案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)

      })}

【讨论】:

  • 谢谢@SBista。两人都完成了工作。我得到了与 updateCheckboxGroupInput 类似的地方,但我有可能通过/不通过“会话”,我通常不将其添加为参数。
猜你喜欢
  • 2015-08-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-23
  • 2018-09-07
  • 2019-03-09
  • 2013-06-17
  • 2018-02-04
相关资源
最近更新 更多