R语言 Shiny DT隐藏具有相同列值的行,并使用按钮隐藏/显示行

von4xj4u  于 2023-06-19  发布在  其他
关注(0)|答案(1)|浏览(178)

我想使用一个按钮来显示/隐藏DT表的行,这些行在一个列中具有相同的值,但保留其中一行,以便它可以被选中。我希望这是一个客户端操作,因为我想继续使用自定义过滤器扩展的所有行。
我怀疑有一个JavaScript JS()函数或回调函数可以与shining R集成来管理这个问题,但没有必要的专业知识来实现它。
例如在下面的情况下:我们将隐藏所有有重复物种的行,但每个物种将有一行。

library(shiny)
library(DT)
shinyApp(

  ui = fluidPage(DTOutput('tbl')),

  server = function(input, output) {
    output$tbl = renderDT(
      iris, options = list(lengthChange = FALSE)
    )
  }
)

谢谢
亚伦

wb1gzix0

wb1gzix01#

有个办法这个想法是添加一个新的列

c("setosa", "", "", ..., "virginica", "", "", ..., "versicolor", "", "", ...)

到dataframe,然后单击按钮在此列中搜索setosa,virginica或versicolor。当然,此列对用户是隐藏的。

library(DT)
library(shiny)

dat <- iris
column <- "Species"
groups <- split(as.character(dat[[column]]), dat[[column]]) # use as.character 
                                                            # because it's factor
for(g in names(groups)) {
  group <- groups[[g]]
  groups[[g]][tail(seq_along(group), -1L)] <- ""
}

newColumn <- unsplit(groups, dat[[column]])
dat <- cbind(dat, newColumn)
index <- ncol(dat) # index of newColumn; subtract 1 if you don't show 
                   # row names in the DT table

levels <- names(groups)
regex <- paste0("(", paste0(levels, collapse = "|"), ")")
callback <- c(
  "var flag = true;",
  sprintf("var regex = '%s';", regex),
  sprintf("var j = %d;", index),
  "$('#btn').on('click', function() {",
  "  if(flag) {",
  "    table.columns(j).search(regex, true, false).draw();",
  "  } else {",
  "    table.columns(j).search('').draw();",
  "  }",
  "  flag = !flag;",
  "});"
)

dtable <- datatable(
  dat, 
  callback = JS(callback),
  options = list(
    columnDefs = list(
      list(targets = index, visible = FALSE)
    )
  )
)

ui <- fluidPage(
  br(),
  actionButton("btn", "Hide/show"),
  br(),
  DTOutput("tbl")
)

server <- function(input, output, session) {
  output[["tbl"]] <- renderDT(
    dtable
  )
}

shinyApp(ui, server)

相关问题