【问题标题】:rhandsontable on multiple tables from SQlite databaserhandsontable 在 SQlite 数据库中的多个表上
【发布时间】:2018-02-24 20:20:36
【问题描述】:

我们将不胜感激。

我正在开发一个闪亮的应用程序,它涉及使用多个 SQlite 数据库和 rhandsontable 包。我在网上找到了很多关于使用这个包的有用材料,但我感到很沮丧,因为我花了 2 天时间解决一个我认为值得一问的问题。

所以下面的脚本描述了服务器和 rhandsontable 的 UI。我希望能够启用用户编辑,并保护他们修改过的表格(网上有很多报道),但跨越多个表格(我正在努力解决这个问题)

我的代码所做的是打开第一个表,是的,如果我进行修改,它确实是安全的。但是当我尝试通过选择输入转到另一个表时,另一个表的内容会立即被初始修改的内容REPLACED

我真的希望修改独立而不影响其他表。

再次感谢您的帮助。

downloadTableUI <-  function(id) {
  ns <- NS(id)
  tagList(
    sidebarLayout(
      sidebarPanel( 
        selectInput(ns("dataset"), "Choose a dataset:",
          choices = dput(as.character(alltables[1: NROW(alltables)]))),
        radioButtons(ns("filetype"), "File type:",
          choices = c("csv", "tsv")),
        dateRangeInput(ns("daterange2"), "Date Filtration",
          start = "2017-02-17",
          end = "2017-03-07"),
        actionButton(ns("saveBtn"), "Save"),
        br(),
        downloadButton(ns('downloadData'), 'Download File', class = "btn-info")
      ),
      mainPanel(
        rHandsontableOutput(ns('tabletest'), width = 730, height = 600)
      ),
      position = c("left")
    )
  )
}

DownloadTable <-  function(input, output, session, pool) {
#select databases
  tableChoozer <- reactive({input$dataset})
  # dateSelector <- reactive({input$daterange2})

  # Initiate the reactive table
  p1 <- reactive({
    results <- dbGetQuery(pool, paste('select * from ', tableChoozer()))
    return (results) 
  })

  Mychanges <- reactive({

    observe({
    input$saveBtn# update database file each time the button is pressed
    if (!is.null(input$tabletest)) {#if there 's a table input
      dbWriteTable(pool, tableChoozer(),hot_to_r(input$tabletest), overwrite = TRUE, row.names = FALSE)# overwrite the database
    }
  })
#THIS IS WHERE I THINK THE PROBLEM IS
    if (is.null(input$tabletest)) {
      return (p1())
    } else if (!identical(p1(), input$tabletest)) {
      mytable <- as.data.frame(hot_to_r(input$tabletest))
      return (mytable)
    }
  })


output$tabletest <- renderRHandsontable({
    rhandsontable(Mychanges()) %>%
    hot_cols(columnSorting = TRUE, highlightCol = TRUE, highlightRow = TRUE,allowRowEdit = FALSE, allowColEdit = FALSE, exportToCsv = TRUE)
  })


  output$downloadData <- downloadHandler(
    filename = function() {
      paste("table.csv")
    },
    content = function(file) {
      sep <- switch (input$filetype, "csv" = ",", "tsv" = "\t")

      write.table(p1(), file, sep = sep, row.names = FALSE)
    }
  )
}

【问题讨论】:

    标签: r shiny rhandsontable


    【解决方案1】:

    此代码未经测试,但希望它能正常工作。将以下内容放在您的 server.R 文件的顶层

    observeEvent( input$saveBtn, 
      {
        # update database file each time the button is pressed
        if (!is.null(input$tabletest)) {
          #if there 's a table input
          dbWriteTable(pool, tableChoozer(),
            hot_to_r(input$tabletest), overwrite = TRUE, row.names = FALSE)
            # overwrite the database
       },
       ignoreInit = TRUE
    )
    

    使用observeEvent 而不是observe 可以防止对tableChoozerinput$tabletest 的反应性依赖,这似乎是您的问题。 ignoreInit 使得在保存按钮初始化时不会触发保存事件。

    【讨论】:

    • 感谢您回复我。我意识到我没有提供可重现的代码,因此我对任何人和/或我自己都没有帮助,因此可以对其进行测试以获得适当的答案。因此,我已经针对代码 github.com/BrianMaja/EDSS_table_issue/tree/master/EDSS 的问题进行了回购,我相信这将帮助您对其进行测试,以便您可以提供帮助。再次感谢!
    • Gregor de Cillia,谢谢!!.....它的工作原理!!...在 github 链接上发布了解决方案
    猜你喜欢
    • 2011-12-02
    • 2023-03-08
    • 1970-01-01
    • 2019-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-05
    相关资源
    最近更新 更多