上传文件后编辑RHandsonTable

问题描述 投票:0回答:1

我构建了一个 R-shiny 应用程序,允许用户手动将数据键入 RHandsonTable 或上传 csv 文件。独立地来说,这些工作得很好。但是,如果用户首先上传文件,然后尝试手动编辑表格,我将无法保留更改。

如果运行下面的示例,您将看到,如果选中一些框并单击“执行”按钮,则布尔值将正确显示在输出表中。同样,如果您上传一个简单的 csv 文件(示例文件也在下面)并点击“Go”,则布尔值将正确显示在输出表中。但是,如果您上传文件,然后尝试选中或取消选中这些框,它们会立即恢复为上传的值,并且仅显示上传的值,直到应用程序重新启动。关于如何重新编码以便它可以处理上传并允许用户编辑该上传的任何想法?

MRE:

library(shiny)
library(rhandsontable)
library(shinythemes)
library(data.table)

ui <- fluidPage(
  actionButton("go", "Go"),
  fileInput('file',label=''),
  rHandsontableOutput('table1'),
  tableOutput('table2')
)

DF1 <- data.frame(col1 = rep(F,3),col2 = rep(F,3))

server <- function(input, output, session) {
  values <- reactiveValues()
  
  observe({
    if (!is.null(input$table1)) {
      DF1 <- hot_to_r(input$table1)
    } else {
      if (is.null(values$DF1))
        DF1 <- DF1
      else
        DF1 <- values$DF1
    }
    values$DF1 <- DF1
  })
  
  output$table1 <- renderRHandsontable({
    if (!is.null(input$file)){
      inputfile <- fread(input$file$datapath)
      values$DF1 <- inputfile
      rhandsontable(values$DF1)
    } else {
      if (!is.null(values$DF1)) rhandsontable(values$DF1)
    }
  })
  
  observeEvent(input$go,{values$DF2<-values$DF1})
  output$table2 <- renderTable(values$DF2)
}

shinyApp(ui, server)

对于要上传的简单文件,像这样的 csv 证明了这一点:

第 1 列,第 2 列

对,错

错,对

对,错

r shiny rhandsontable
1个回答
0
投票

renderRHandsontable()
中检查
if (!is.null(input$file))
,如果这是真的,则从输入文件中获取
rhandsontable
的值。但是,上传后始终满足条件,因此上传后无法再编辑表格。

相反,您可以将其从

renderRHandsontable
中取出,并将其放入
observeEvent
上的
input$file
中,在上传完成后替换表中的值一次(此事件仅在上传后触发一次):

library(shiny)
library(rhandsontable)
library(shinythemes)
library(data.table)

ui <- fluidPage(
  actionButton("go", "Go"),
  fileInput('file', label = ''),
  rHandsontableOutput('table1'),
  tableOutput('table2')
)

DF1 <- data.frame(col1 = rep(F, 3), col2 = rep(F, 3))

server <- function(input, output, session) {
  values <- reactiveValues()
  
  observe({
    if (!is.null(input$table1)) {
      DF1 <- hot_to_r(input$table1)
    } else if (is.null(values$DF1)){
        DF1 <- DF1
    }
    values$DF1 <- DF1
  })
  
  observeEvent(input$file, {
    inputfile <- fread(input$file$datapath, drop = 1)
    values$DF1 <- inputfile
  })
  
  output$table1 <- renderRHandsontable({
    req(values$DF1)
    rhandsontable(values$DF1)
  })
  
  observeEvent(input$go, {
    values$DF2 <- values$DF1
  })
  output$table2 <- renderTable(values$DF2)
}

shinyApp(ui, server)
© www.soinside.com 2019 - 2024. All rights reserved.