如何将逻辑列转换为闪亮应用程序数据表中的静态复选框?

How to convert logical column to static checkboxes in a datatable in shiny app?

我想在我闪亮的应用程序中显示一个包含一列逻辑值的数据 table。但是,此列不应显示 TRUEFALSE,而是显示静态复选框。所以点击复选框不应该改变任何东西。我希望 TRUE 转换为选中的复选框,FALSE 转换为未选中的复选框。

我认为我在 https://rstudio.github.io/DT/options.html 的第 4.4 节中找到的内容可能会有帮助。不幸的是,我对 javascript 一点经验都没有。我搜索了 javascript 可以执行我想要的操作的代码,并将其粘贴到我的 R 代码中,就像在 link 的示例中所做的那样。然而,什么也没有发生。

这是一个小例子:

library(shiny)
library(data.table)
library(DT)

set.seed(42)
A <- rep(0, 10)
for (i in seq_len(10)) {
  random_length <- sample(1:10, 1)
  random_letters <- sample(letters, random_length)
  A[i] <- paste0(random_letters, collapse = "")
}
B <- sample(c(TRUE, FALSE), 10, replace = TRUE)
dt <- data.table(A, B)

ui <- fluidPage(
  dataTableOutput("tableId")
)

server <- function(input, output, session) {
  output$tableId <- renderDataTable(
    dt, 
    options = list(columndDefs = list(list(
      targets = 2, 
      render = JS(
        "function(data, type, full, meta) {", 
        "return data ? '<input type='checkbox' disabled checked/>' : <input type='checkbox' disabled/>'", 
        "}")
    ))))
}

shinyApp(ui, server)

但是 link 中的示例有效:

library(shiny)
library(data.table)
library(DT)

set.seed(42)
A <- rep(0, 10)
for (i in seq_len(10)) {
  random_length <- sample(1:10, 1)
  random_letters <- sample(letters, random_length)
  A[i] <- paste0(random_letters, collapse = "")
}
B <- sample(c(TRUE, FALSE), 10, replace = TRUE)
dt <- data.table(A, B)

ui <- fluidPage(
  dataTableOutput("tableId")
)

server <- function(input, output, session) {
  output$tableId <- renderDataTable(
    dt, 
    options = list(columnDefs = list(list(
      targets = 1,
      render = JS(
        "function(data, type, row, meta) {",
        "return type === 'display' && data.length > 6 ?",
        "'<span title=\"' + data + '\">' + data.substr(0, 6) + '...</span>' : data;",
        "}")
    ))))
}

shinyApp(ui, server)

我完全没有 javascript 的经验,不知道如何解决这个问题,所以我希望你能帮助我。

你的代码有两个问题:

  • 您输入的是 columndDefs 而不是 columnDefs

  • 您在 render JavaScript 函数中使用了相同类型的引号,您必须改为:

    return data ? '<input type=\"checkbox\" checked/>' : '<input type=\"checkbox\"/>';"

另请注意,最好仅在 type'display' 时应用自定义渲染,即:

render = JS(
  "function(data, type, row, meta) {",
  "  if(type === 'display'){",
  "    return data ? '<input type=\"checkbox\" checked/>' : '<input type=\"checkbox\"/>';", 
  "  }",
  "  return data;",
  "}"
)