web-dev-qa-db-fra.com

R brillant: comment mettre à jour un bloc de données réactif à chaque fois que l'on appuie sur un bouton action sans créer un nouveau bloc de données réactif?

Mon application brillante permet à l'utilisateur de télécharger un fichier csv en utilisant fileInput et stocké en tant qu'objet réactif df_data. J'ai ensuite créé un numericInput pour que l'utilisateur saisisse un numéro de ligne à supprimer du bloc de données. Cependant, j'ai eu une erreur sur évaluation imbriquée trop profondément: récursion infinie/options (expressions =)?.

Voici mon code pour 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")
  )
))

Et ci-dessous est mon code pour 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())
})

J'ai résolu le problème en affectant la trame de données sous-réglée à une nouvelle trame de données réactive appelée, par exemple, df_data2. Mais je veux que l'utilisateur puisse continuer à supprimer différentes lignes en entrant des valeurs dans Supprimer la ligne et en appuyant sur le bouton Aller. Ensuite, cette solution ne fonctionnera pas car je devrai attribuer df_data3, df_data4 ... et je ne pouvais pas prédire à l'avance combien de fois l'utilisateur appuiera sur le bouton Go.

Je suis un nouvel utilisateur de shiny depuis environ 2 semaines et je cherche des solutions à ce sujet depuis une semaine. Est-ce qu'il y a quelqu'un qui peut m'aider? Un million de merci !!

32
Lawrence Lee

Voici une solution de travail. J'ai créé un reactiveValues pour stocker la trame de données. Lorsqu'un fichier est choisi, la trame de données est remplie. Lorsque vous appuyez sur le bouton Supprimer, cette même trame de données obtient une ligne supprimée. La table génère toujours tout ce que cet objet de trame de données contient. J'espère que ce code peut être un bon matériel d'apprentissage

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)
})))
60
DeanAttali