R блестящий: Как обновлять фрейм реактивных данных каждый раз, нажимая кнопку action без создания нового фрейма реактивных данных?

Мое блестящее приложение позволяет пользователю загружать 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 ... и я не мог заранее предсказать, сколько раз пользователь нажмет кнопку Go.

Я новичок в бриллиантах уже около 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)
})))
Другие вопросы по тегам