【问题标题】:Shiny: cannot delete rows more than 1 time闪亮:不能删除行超过 1 次
【发布时间】:2015-07-02 13:41:28
【问题描述】:

我正在开发一个闪亮的应用程序。 server.R 包含如下代码......

dFt1 <- reactiveValues()
dFt1$dat <- data.frame(loadTransactionData())
...
output$t_tab_1 <- DT::renderDataTable({
    DT::datatable(
        dFt1$dat
        ,selection = list(mode = "single")
        ,options = list(
            rownames = TRUE
            ,pageLength = 10
            ,order = list(list(2,"desc"),list(1,"asc"))
        )
    )
})
...
observe({
    if (is.null(input$delete) || input$delete == 0){return()}
    session$sendCustomMessage(
        type = 'jsCode'
        ,list(value = 'confirm("Are You Sure?");')
    )
})

observeEvent(input$deleteConfirmChoice, {
    if (input$deleteConfirmChoice == "TRUE") {
        x <- input$t_tab_1_rows_selected
        deleteTransaction(x)
        isolate(dFt1$dat <- dFt1$dat[row.names(dFt1$dat) != x, ])
    }
})  

deleteTransaction <- function(x) {
    qy <- "DELETE FROM Transactions where timestamp = '<t>'"
    qy <- gsub("<t>",x,qy)
    db <- dbConnect(SQLite(), dbname=systemDatabase)
    dbGetQuery(db,qy)
    dbDisconnect(db)
}

当然还有 ui.R 中的删除按钮和调用 javascript 确认框。

应用程序运行良好。我可以选择一条记录并删除它。然后我可以选择另一条记录。但我无法删除它。 javascript 确认框运行,但单击“是”不会删除记录。我想知道为什么一次可以,但下次不行。

有什么帮助吗?

【问题讨论】:

  • 我想我有一些线索。在第一次尝试中,我单击了将 input$deleteConfirmChoice 设置为 TRUE 的 OK 按钮。当我第二次这样做时,它的值仍然是 true,所以值没有变化。因此,代码不会执行。如何解决这个问题?

标签: javascript r datatables shiny


【解决方案1】:

好的!终于找到了可行的东西......

    observeEvent(input$deleteConfirmChoice, {
    if (input$deleteConfirmChoice == "TRUE") {
        x <- input$t_tab_1_rows_selected
        deleteTransaction(x)
        isolate(dFt1$dat <- dFt1$dat[row.names(dFt1$dat) != x, ])
        shinyjs::disable("delete")
        shinyjs::disable("edit")
        session$sendCustomMessage(
            type = 'jsCode'
            ,list(value = '1 != 1;')
        )
    }
})  

我添加了另一个评估为 FALSE 的 session$sendCustomMessage 调用。

不知道有没有更好的解决方案?

【讨论】:

  • 嗨,我是 shinyjs 的作者,我只是想指出,如果你使用的是 shinyjs,你不应该使用 session$sendCustomMessage - 你应该查看 shinyjs::extendShinyjs 来让调用javascript函数更简单
【解决方案2】:

这是另一种方法...

我更改了传递给 session$sendCustomMessage 的 javascript 代码。单击“否”按钮返回 0。单击“是”按钮返回一个随机数。我希望这将保证在两次连续单击“是”按钮时获得不同的值。

    observe({
    if (is.null(input$delete) || input$delete == 0){return()}
    session$sendCustomMessage(
        type = 'jsCode'
        ,list(value = 
            '
            (function() {
                if (confirm("Are you sure?")) {
                    return Math.random()*3 + 1;
                } else {
                    return 0;
                }
            })()
            '
        )
    )
})

observeEvent(input$deleteConfirmChoice, {
    if (input$deleteConfirmChoice == "TRUE") {
        x <- input$t_tab_1_rows_selected
        deleteTransaction(x)
        isolate(dFt1$dat <- dFt1$dat[row.names(dFt1$dat) != x, ])
    }
})  

还有其他更清洁的解决方案吗?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-26
    • 2018-10-25
    • 1970-01-01
    相关资源
    最近更新 更多