Ввод Shiny R — Непрерывное добавление в конец кадра данных

#r #shiny

Вопрос:

В настоящее время у меня есть следующее блестящее приложение, и я намерен добавить ввод текста в качестве новой строки в набор данных. В настоящее время новый ввод текста переопределяет старый ввод вместо добавления в конец. Я понимаю, что это происходит, потому что я имею в виду df в eventReactive, который является изначально заполненным пустым фреймом данных, но мои различные попытки обойти это привели к ошибкам.

Кто-нибудь знает, как это исправить? Бонус, если есть способ очистить поле ввода текста после нажатия кнопки отправить.

 library(shiny)

colClasses = c("factor", "numeric")
col.names = c("Player", "1")

df <- read.table(text = "",
                 colClasses = colClasses,
                 col.names = col.names)
ui <- fluidPage(

    # Application title
    titlePanel("Random Draft Order"),

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
        sidebarPanel(
            textInput("AddPlayer",
                        "Add Player",
                        ""),
            actionButton("submit", ("Submit"))
        ),

        # Show a plot of the generated distribution
        mainPanel(
           tableOutput("racingbars")
        )
    )
)

server <- function(input, output) {
    

    actionButton("submit", ("Submit"))
    
    FinalData = eventReactive(input$submit,{
        df = rbind(df, data.frame("Player" = input$AddPlayer, "X1" = ""))
    })
    

    output$racingbars <- renderTable({
                 FinalData()    
        })
}

# Run the application 
shinyApp(ui = ui, server = server)
 

Ответ №1:

Вы могли бы попробовать создать reactiveVal файл, в котором будут храниться данные.

Во-первых, вы можете инициализировать свой data.frame df как reactiveVal :

 df <- reactiveVal(data.frame(Player = character(), 
                             X1 = character()))
 

Для обновления reactiveVal вы можете использовать:

 df(new_dat)
 

И чтобы ссылаться на данные позже, используйте:

 df()
 

В вашем примере кнопка «Отправить» observeEvent может быть активирована с помощью кнопки «Отправить». Когда это произойдет, вы можете добавить свою строку данных в reactiveVal data.frame аналогично тому, что вы сделали. Затем output можно указать на фрейм reactiveVal data.для отображения данных.

Я также добавил updateTextInput observeEvent , чтобы очистить ввод текста после нажатия кнопки «Отправить». Обратите внимание, что это требуется session в объявлении функции сервера.

 server <- function(input, output, session) {
  
  df <- reactiveVal(data.frame(Player = character(), 
                               X1 = character()))
  
  observeEvent(input$submit, {
    new_dat <- rbind(df(), data.frame(Player = input$AddPlayer, X1 = ""))
    df(new_dat)
    updateTextInput(session, "AddPlayer", value = "")
  })
  
  output$racingbars <- renderTable({
    df()   
  })
}
 

Комментарии:

1. Это сработало отлично. Мне придется потратить немного времени и узнать больше о реактивном программировании, которое мне трудно понять интуитивно.

2. @CcS Отлично! Рад слышать. Я также добавил немного больше объяснений reactiveVal . Подробнее о реактивности здесь и здесь .