在闪亮的应用程序中取消选择列或编辑数据表时,下载按钮消失

Posted

技术标签:

【中文标题】在闪亮的应用程序中取消选择列或编辑数据表时,下载按钮消失【英文标题】:download button disappear when deselecting column or editing data table in shiny app 【发布时间】:2020-01-30 23:33:26 【问题描述】:

我构建了一个闪亮的应用程序,用于下载自定义和可编辑的数据表。这里我以iris 数据集为例。

根据这个post,我添加了一个按钮来将整个数据集下载为csv。

但是,出现了一个问题。当我试图取消选中某些列或编辑表时,下载按钮就会消失。而且它再也不会出现了。

我花了几个小时试图弄清楚但没有成功。 有谁知道为什么会这样?提前非常感谢。

library(shiny)
library(DT)
library(dplyr)


    # UI
    ui = fluidPage(
                   downloadButton("download1","Download iris as csv"),
                   DT::dataTableOutput('tbl'),
                   checkboxGroupInput('datacols', 
                                      label='Select Columns:',
                                      choices= c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Specie'),
                                      selected = c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Specie'),
                                      inline=TRUE )

                   )

    # SERVER
    server = function(input, output) 



        df = reactiveValues()

        observe (

            df$dat = iris %>% select(one_of(input$datacols))
        )
        # render DT
        output$tbl = renderDT(
                datatable(df$dat,
                editable = "cell",
                callback = JS("$('div.dwnld').append($('#download1'));"),
                extensions = "Buttons",
                options = list(
                    dom = 'B<"dwnld">frtip',
                    buttons = list(
                        "copy" ) ) )

        )


        observeEvent(input[["tbl_cell_edit"]], 
            cellinfo <- input[["tbl_cell_edit"]]
            df$dat  <- editData(df$dat,  input[["tbl_cell_edit"]] )
        )

        output$download1 <- downloadHandler(
            filename = function() 
                paste("data-", Sys.Date(), ".csv", sep="")
            ,
            content = function(file) 
                write.csv(df$dat, file)
            
        )

    

shinyApp(ui, server)

【问题讨论】:

【参考方案1】:

非常有趣的案例。

每次编辑单元格或选择/取消选择列时,df$dat 都会更改,然后重新呈现表格。但是随后包含在表中的元素#download1 在 DOM 中不再存在。

我们必须找到一种方法来选择/取消选择某些列并编辑某些单元格而不重新渲染表格。这是一个:

library(shiny)
library(DT)
library(dplyr)

# UI
ui = fluidPage(
  downloadButton("download1", "Download iris as csv"),
  DTOutput('tbl'),
  checkboxGroupInput(
    'datacols', 
    label='Select Columns:',
    choices= c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species'),
    selected = c('Sepal.Length', 'Sepal.Width', 'Petal.Length', 'Petal.Width', 'Species'),
    inline=TRUE)

)

# SERVER
server = function(input, output) 

  dat <- iris

  # render DT
  output$tbl = renderDT(
    datatable(dat,
              editable = "cell",
              callback = JS(
                "$('div.dwnld').append($('#download1'));",
                "var checkboxes = $('input[name=datacols]');",
                "checkboxes.each(function(index,value)",
                "  var column = table.column(index+1);",
                "  $(this).on('click', function()",
                "    if($(this).prop('checked'))",
                "      column.visible(true);",
                "    else",
                "      column.visible(false);",
                "    ",
                "  );",
                ");"
              ),
              extensions = "Buttons",
              options = list(
                dom = 'B<"dwnld">frtip',
                buttons = list("copy")
              ) 
    )

  )

  observeEvent(input[["tbl_cell_edit"]], 
    cellinfo <- input[["tbl_cell_edit"]]
    dat <<- editData(dat, cellinfo, "tbl")
  )

  output$download1 <- downloadHandler(
    filename = function() 
      paste("data-", Sys.Date(), ".csv", sep="")
    ,
    content = function(file) 
      write.csv(dat %>% select(one_of(input$datacols)), file)
    
  )



shinyApp(ui, server)

【讨论】:

谢谢!!非常出色的解决方案。虽然我对javascript知之甚少。然而,我的真实案例,dat 不是像 iris 这样的静态数据集,它是一个reactive 元素。当我将此解决方案应用于我的真实案例时,我发现了另一个问题。编辑单元格后,下载按钮消失。我在这里打开了另一个问题***.com/questions/58194795/…

以上是关于在闪亮的应用程序中取消选择列或编辑数据表时,下载按钮消失的主要内容,如果未能解决你的问题,请参考以下文章

运行冗长闪亮的应用程序时网络超时

以闪亮的意外行为取消组合和选择

编辑表时如何使用数据表在闪亮表中创建下拉列表?

在闪亮的应用程序中将 textInput 元素排列在两列或多列中

由于用户选择,当列改变位置时,在Shiny中取消选择DT :: formatRound中的列

开发选择/取消选择所有按钮以获得闪亮效果