R shiny: Как обновить блок реактивной информации каждый раз, нажимая кнопку actionButton без создания нового реактивного фрейма данных?
Мое блестящее приложение позволяет пользователю загружать csv с помощью fileInput и храниться как реактивный объект df_data. Затем я создал numericInput для пользователя, чтобы ввести номер строки для удаления из фрейма данных. Тем не менее, я получил сообщение об ошибке , вложенной слишком глубоко: бесконечная рекурсия/параметры (выражения =)?.
Ниже мой код для ui.R.
shinyUI(fluidPage(
titlePanel("amend data frame"),
mainPanel(
fileInput("file", "Upload file"),
numericInput("Delete", "Delete row:", 1, step = 1),
actionButton("Go", "Delete!"),
tableOutput("df_data")
)
))
И ниже мой код для server.R.
shinyServer(function(input, output) {
df_data <- reactive({
read.csv(input$file$datapath)
})
df_data <- eventReactive(
input$Go,
df_data()[-input$Delete,]
)
output$df_data <- renderTable(df_data())
})
Я решил проблему, назначив фрейм подмножеств в новый реактивный фрейм данных, называемый, например, df_data2. Но я хочу, чтобы пользователь мог продолжать удалять разные строки, введя значения в Удалить строку и нажмите кнопку Перейти. Тогда это решение не будет работать, поскольку мне придется назначить df_data3, df_data4... и я не мог заранее предсказать, сколько раз пользователь будет нажимать кнопку Перейти.
Я новый пользователь, чтобы блистать около 2 недель, и я искал решения об этом в течение недели. Есть ли кто-нибудь, кто может мне помочь? Миллион спасибо!
Ответы
Ответ 1
Ниже приведено рабочее решение. Я создал reactiveValues
для хранения данных. Когда выбран файл, заполняется dataframe. Когда нажата кнопка удаления, тот же файл данных удаляет строку. В таблице всегда выводится то, что удерживает объект данных. Я надеюсь, что этот код может быть хорошим учебным материалом.
runApp(shinyApp(
ui=(fluidPage(
titlePanel("amend data frame"),
mainPanel(
fileInput("file", "Upload file"),
numericInput("Delete", "Delete row:", 1, step = 1),
actionButton("Go", "Delete!"),
tableOutput("df_data_out")
)
)),
server = (function(input, output) {
values <- reactiveValues(df_data = NULL)
observeEvent(input$file, {
values$df_data <- read.csv(input$file$datapath)
})
observeEvent(input$Go, {
temp <- values$df_data[-input$Delete, ]
values$df_data <- temp
})
output$df_data_out <- renderTable(values$df_data)
})))