如何解决如何在R Shiny中将selectizeGroupUI与DT :: datatable一起使用
根据selectizeGroup-module的官方文档中的示例,我可以执行以下操作:
library(shiny)
library(shinyWidgets)
library(dplyr)
data("mpg",package = "ggplot2")
ui <- fluidPage(
fluidRow(
column(
width = 10,offset = 1,tags$h3("Filter data with selectize group"),panel(
selectizeGroupUI(
id = "my-filters",params = list(
manufacturer = list(inputId = "manufacturer",title = "Manufacturer:"),model = list(inputId = "model",title = "Model:"),trans = list(inputId = "trans",title = "Trans:"),class = list(inputId = "class",title = "Class:")
)
),status = "primary"
),DT::dataTableOutput(outputId = "table")
)
)
)
server <- function(input,output,session) {
mpgView2 <- reactive({
mpg
})
res_mod <- callModule(
module = selectizeGroupServer,id = "my-filters",data = mpgView2,vars = c("manufacturer","model","trans","class")
)
output$table <- DT::renderDataTable({
req(res_mod())
res_mod()
})
}
shinyApp(ui,server)
并且过滤器工作完美。我的要求还告诉我,该表需要可编辑,隐藏一些列,设置舍入格式等。我通常会这样做:
mpgView1 <- reactive({
DT::datatable(
mpg,filter = "none",selection = "none",style = "bootstrap",extensions = c("Scroller","FixedColumns"),options = list(
dom = 't',scrollY = 500,scrollX = 400,scroller = TRUE,defRender = TRUE,autoWidth = TRUE,targets = "no-sort",bSort = FALSE,order = c(),fixedColumns = list(leftColumns = 2),columnDefs = list(
list(
visible = FALSE,targets = c(0)
),list(
width = "50px",targets = "_all"
)
)
),editable = list(
target = 'cell',disable = list(columns = c(0,1,2))
)
) %>%
DT::formatRound(
columns = c(3)
)
})
output$table <- DT::renderDataTable({
mpgView1()
})
但是现在我不确定如何“结合”这两种功能。如果我确实尝试将 mpgView1()放入 res_mod 内,则会出现错误:
Warning: Error in as.data.frame.default: cannot coerce class ‘c("datatables","htmlwidget")’ to a data.frame
感谢您的帮助。谢谢。
解决方法
selectizeGroupServer
的输出是您过滤后的数据,它们是反应式的,因此您可以在根据您的需要设置样式的datatable
调用中使用此输出。数据表可编辑的要求带来了一些问题:selectizeGroupServer
需要了解新数据。这是可能的,但是在我的解决方案中,表会完全刷新,并且现有过滤器会丢失。我认为您可以尝试使用proxy
来获得更好的行为,但是proxy
和selectizeGroupServer
的组合会有些棘手。
library(shiny)
library(shinyWidgets)
library(dplyr)
#>
#> Attache Paket: 'dplyr'
#> The following objects are masked from 'package:stats':
#>
#> filter,lag
#> The following objects are masked from 'package:base':
#>
#> intersect,setdiff,setequal,union
data("mpg",package = "ggplot2")
ui <- fluidPage(
fluidRow(
column(
width = 10,offset = 1,tags$h3("Filter data with selectize group"),panel(
selectizeGroupUI(
id = "my-filters",params = list(
manufacturer = list(inputId = "manufacturer",title = "Manufacturer:"),model = list(inputId = "model",title = "Model:"),trans = list(inputId = "trans",title = "Trans:"),class = list(inputId = "class",title = "Class:")
)
),status = "primary"
),DT::dataTableOutput(outputId = "table")
)
)
)
server <- function(input,output,session) {
mpgView2 <- reactiveVal(mpg)
observeEvent(input$table_cell_edit,{
cell <- input$table_cell_edit
updated_data <- mpgView2()
updated_data[cell$row,cell$col] <- cell$value
mpgView2(updated_data)
})
res_mod <- callModule(
module = selectizeGroupServer,id = "my-filters",data = mpgView2,vars = c("manufacturer","model","trans","class")
)
output$table <- DT::renderDataTable({
req(res_mod())
DT::datatable(
res_mod(),filter = "none",selection = "none",style = "bootstrap",extensions = c("Scroller","FixedColumns"),options = list(
dom = 't',scrollY = 500,scrollX = 400,scroller = TRUE,defRender = TRUE,autoWidth = TRUE,targets = "no-sort",bSort = FALSE,order = c(),fixedColumns = list(leftColumns = 2),columnDefs = list(
list(
visible = FALSE,targets = c(0)
),list(
width = "50px",targets = "_all"
)
)
),editable = list(
target = 'cell',disable = list(columns = c(0,1,2))
)
) %>%
DT::formatRound(
columns = c(3)
)
})
}
shinyApp(ui,server)
由reprex package(v0.3.0)于2020-08-26创建
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。