我构建了一个R-shine应用程序,允许用户手动将数据输入到一个RHandsonTable中,或者上传一个csv文件.独立地,这些都很好.但是,如果用户先上传一个文件,然后try 手动编辑表格,我就无法让更改生效.

如果你运行下面的例子,你会看到如果你选中了一些框并点击"Go"按钮,那么布尔值就会正确地显示在输出表中.类似地,如果你上传一个简单的csv文件(下面也是示例文件)并点击"Go",那么布尔值就会正确地显示在输出表中.但是,如果您上传文件,然后try 选中或取消选中这些框,它们会立即恢复到上传的值,并且只会显示上传的值,直到应用程序重新启动.有什么 idea ,如何重新编码,以便它可以处理上传,然后允许用户编辑上传?

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证明了这一点:

COL1,COL2

对,错

假的,真的

对,错

推荐答案

renderRHandsontable()中,您判断if (!is.null(input$file)),如果是真的,则从输入文件中获取rhandsontable的值.但是,上传后条件总是满足的,因此上传后表格不能再编辑.

相反,您可以将其从renderRHandsontable中取出,并将其放入observeEvent on input$file中,该observeEvent在上传完成时会替换表中的值一次(此事件在上传后只触发一次):

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)

R相关问答推荐

是否有任何解决方案可以优化VSCode中RScript的图形绘制?

创建重复删除的唯一数据集组合列表

如果列中存在相同的字符串,则对行值进行总和

有没有一种方法可以从函数中创建一个值的列表,然后将这些值变成R中的直方图?我一直觉得不行

如何将移除事件分配给动态创建的按钮?

在R中将特定列的值向右移动

在连续尺度上转置标签[瀑布图,R]

即使硬币没有被抛出,也要保持对其的跟踪

R spatstat Minkowski Sum()返回多个边界

以相同的方式对每个表进行排序

R中边际效应包中Logistic回归的交互作用风险比

您是否可以将组添加到堆叠的柱状图

为左表中的所有行使用值Fill滚动左连接

R -如何分配夜间GPS数据(即跨越午夜的数据)相同的开始日期?

将多个列合并为一个列的有效方法是什么?

判断函数未加载R中的库

计算来自单独分组的分幅的值的百分位数

在shiny 表格中输入的文本在第一次后未更新

将R中对象的CSV数组转换为JSON数组

如何将两个用不同的运算符替换*的矩阵相乘