R shiny:如何在每次按actionButton时更新反应数据框而不创建新的反应数据框?

时间:2015-04-18 11:45:18

标签: r shiny

我的闪亮应用程序允许用户使用 fileInput 上传csv并存储为反应对象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")
  )
))

以下是我的服务器代码.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 个答案:

答案 0 :(得分:59)

以下是一个有效的解决方案。我创建了一个reactiveValues来存储数据帧。选择文件后,将填充数据框。按下删除按钮时,同一数据帧将删除一行。该表始终输出数据框对象所持有的内容。我希望这段代码可以成为一个很好的学习材料

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