web-dev-qa-db-ja.com

R shiny:新しいリアクティブデータフレームを作成せずにactionButtonを押すたびにリアクティブデータフレームを更新する方法

私の光沢のあるアプリでは、ユーザーはfileInputを使用してcsvをアップロードし、リアクティブオブジェクトdf_dataとして保存できます。次に、ユーザーがデータフレームから削除する行番号を入力するnumericInputを作成しました。ただし、評価のネストが深すぎる:無限再帰/ options(expressions =)?についてエラーが発生しました。

以下は、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と呼ばれる新しいリアクティブデータフレームに割り当てることで解決しました。しかし、Delete rowに値を入力してGoボタンを押すことで、ユーザーがさまざまな行を削除し続けることができるようにしたいと思います。 df_data3、df_data4 ...を割り当てる必要があるため、このソリューションは機能しません...そして、ユーザーがGoボタンを押す回数を事前に予測できませんでした。

私は約2週間にわたって光り輝く新しいユーザーであり、これに関するソリューションを1週間探しています。私を助けることができる人はいますか?百万の感謝!!

32
Lawrence Lee

以下は実用的なソリューションです。データフレームを保存する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)
})))
60
DeanAttali