在闪亮的应用程序中取消选择列或编辑数据表时,下载按钮消失
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 元素排列在两列或多列中