#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
. Подробнее о реактивности здесь и здесь .