如何将逻辑列转换为闪亮应用程序数据表中的静态复选框?
How to convert logical column to static checkboxes in a datatable in shiny app?
我想在我闪亮的应用程序中显示一个包含一列逻辑值的数据 table。但是,此列不应显示 TRUE
和 FALSE
,而是显示静态复选框。所以点击复选框不应该改变任何东西。我希望 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;",
"}"
)
我想在我闪亮的应用程序中显示一个包含一列逻辑值的数据 table。但是,此列不应显示 TRUE
和 FALSE
,而是显示静态复选框。所以点击复选框不应该改变任何东西。我希望 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;",
"}"
)