Подтвердить что ты не робот

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 недель, и я искал решения об этом в течение недели. Есть ли кто-нибудь, кто может мне помочь? Миллион спасибо!

4b9b3361

Ответ 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)
})))