通过用户输入更新选择输入

UpdateSelectInput by User Input

首先:感谢您的帮助。

我们的想法是创建一个闪亮的应用程序来跟踪某种 "Sports"。也许更像是跟踪饮酒游戏的结果...它称为 Funkyball,您可以将球扔向目标,运行 然后喝酒。我的目标是收集和分析人们投掷、饮水和 运行.

的数据。

第一个 tabPanel 是创建一些 Player。

library(shiny)
ui <- fluidPage(

    mainPanel(tabsetPanel(
        tabPanel("All Player",
                 textInput("str_new_Player","New Player", ""),
                 actionButton("update", "add Player"),
                 tableOutput("tb_player")))))

    server <- function(input, output) {
        values <- reactiveValues()

        values$df <- data.frame("Player" = numeric(0))

        newEntry<- observe({
            if(input$update > 0){
                newLine <- isolate(input$str_new_Player)
                isolate(values$df[nrow(values$df) + 1,] <- c(input$str_new_Player))
            }})
        output$tb_player <- renderTable({values$df})}

    shinyApp(ui = ui, server = server)

到目前为止一切顺利。 在第二个选项卡面板中,您可以根据创建的玩家选择第一个和第二个玩家。那就是我挣扎的地方。 ui:

tabPanel("New Game",
   selectInput("Player_one", "Player 1", choices = "", selected = "")

服务器:

updateSelectInput(session, "Player_one",
                      label = paste("Player 1"),
                      choices = values$df,
                      selected = "")

我不知道如何从更新的 table 中插入选项。

下一步是添加一些操作按钮,如果您单击它们,这些按钮会用数据填充 table。比如命中或未命中以及用于测量人们每场比赛所需时间的秒表。

代码存在一些问题:缺少括号,最重要的是 server 还需要 session 作为输入,因为 updateSelectInput 使用它。我做了一些改变。我使用 observeEvent 而不是 observe。我想你也可以使用 observe,但你真的想观察一个事件,即按钮被按下,所以我认为它更清楚一点。此外,您只需要声明 input$update 并且当那里发生某些变化时它会被触发。在此事件中,您不仅更新了 data.frame,还更新了 "Player_one" 输入。这是一个问题,您使用了完整的 data.frame,但您只需要列 Player:

library(shiny)
ui <- fluidPage(

  mainPanel(tabsetPanel(
    tabPanel("All Player",
             textInput("str_new_Player","New Player", ""),
             actionButton("update", "add Player"),
             tableOutput("tb_player")),
    tabPanel("New Game",
             selectInput("Player_one", "Player 1", choices = "", selected = ""))

    ))
)

  server <- function(input, output, session) {
    values <- reactiveValues()

    values$df <- data.frame("Player" = numeric(0))

    observeEvent(input$update, {
      values$df <- rbind(values$df, data.frame(Player = input$str_new_Player))
      updateSelectInput(session, "Player_one",
                        label = paste("Player 1"),
                        choices = values$df$Player,
                        selected = "")
    })

    output$tb_player <- renderTable({values$df})

    }

  shinyApp(ui = ui, server = server)

我不是很熟悉 reactiveValues 的使用,也许其他人知道这里是否真的需要它们,或者其他解决方案是否更好。