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

Posted

技术标签:

【中文标题】如何在闪亮应用程序的数据表中将逻辑列转换为静态复选框?【英文标题】:How to convert logical column to static checkboxes in a datatable in shiny app? 【发布时间】:2021-10-01 03:25:42 【问题描述】:

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

我认为我在 https://rstudio.github.io/DT/options.html 第 4.4 节下找到的内容可能会有所帮助。不幸的是,我完全没有使用 javascript 的经验。我搜索了可以做我想做的事情的 javascript 代码,并将其粘贴到我的 R 代码中,就像在链接的示例中所做的那样。然而,什么也没发生。

这是一个小例子:

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)

但链接中的示例有效:

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经验的我不知道如何解决这个问题,所以我希望你能帮助我。

【问题讨论】:

【参考方案1】:

你的代码有两个问题:

您输入的是columndDefs 而不是columnDefs

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

return data ? '&lt;input type=\"checkbox\" checked/&gt;' : '&lt;input type=\"checkbox\"/&gt;';"

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

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

【讨论】:

非常感谢。现在我意识到我发现的 javascript 代码并没有真正做到我想要的。当我点击一个复选框时,它会改变。但是我想要的是一个当我点击它时不会改变的复选框。您知道如何实现这一目标吗? @FireSalamander 添加disabled,就像在您的帖子中一样。

以上是关于如何在闪亮应用程序的数据表中将逻辑列转换为静态复选框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 rhandsontable 中将逻辑值显示为 UI 上的复选框

如何在熊猫中将列转换为一个日期时间列?

闪亮:更改输入后保持选中数据表上的框

如何在 SQL 查询中将行转换为固定列

如何在 Azure 逻辑应用中将 blob 文件内容转换为 .docx

如何在配置单元中将字符串数据类型列转换为日期格式