如何在闪亮的数据表中更改过滤器中布尔值的名称?

How to change names inside filter for booleans in datatable in shiny?

我在 Shiny 中有一个数据表,我在其中使用了 filter 选项。当我想过滤一个布尔列时,我可以选择 truefalse。我想重命名这些值。因此,它应该显示 yesno.

,而不是 truefalse

显示的列条目不是 TRUEFALSE,而是复选框。这很重要,这就是我将其添加到代码示例中的原因。

我想到了将布尔值转换为因子。然后筛选器显示 yesno。然而,在这种情况下,所有的复选框都被选中,所以这不起作用。我在下面的代码中注释掉了进行转换的行。如果有没有这个转换步骤的解决方案就好了。

由于我没有找到任何更改值的选项,我想这只能通过 JavaScript 代码来完成。不幸的是,我并不真正熟悉JavaScript。我希望有人打电话来帮助我。

library(shiny)
library(DT)
library(dplyr)
library(forcats)

set.seed(43)
data <- data.frame(A = rnorm(10),
                   B = letters[1:10],
                   C = sample(c(TRUE, FALSE), 10, TRUE))

ui <- fluidPage(
  DTOutput("table_id")
)

server <- function(input, output, session) {
  output$table_id <- renderDT(
    data %>%
      # mutate(C = as_factor(if_else(C == TRUE, "yes", "no"))) %>%
      datatable(filter = "top",
                options = list(
                  columnDefs = list(
                    list(
                      targets = c(3),
                      render = JS(
                        "function(data, type, row, meta) {",
                        "  if(type === 'display'){",
                        "    return data ? '<input type=\"checkbox\" disabled checked/>' : '<input type=\"checkbox\" disabled/>';",
                        "  }",
                        "  return data;",
                        "}"
                      )
                    ))
                )
      )
  )
}

shinyApp(ui, server)

您 data.frame 中的因素 C 将传递“是”或“否”的值;但是,您的 JS 函数正在检查 data 以查看它是 TRUE 还是 FALSE。如果将 data 与“是”进行比较,则“是”将被视为 TRUE,而“否”将被视为 FALSE。让我知道这是否会产生所需的行为。

library(shiny)
library(DT)

set.seed(43)
data <- data.frame(A = rnorm(10),
                   B = letters[1:10],
                   C = sample(c(TRUE, FALSE), 10, TRUE))

ui <- fluidPage(
  DTOutput("table_id")
)

server <- function(input, output, session) {
  output$table_id <- renderDT(
    data %>%
      mutate(C = as_factor(if_else(C == TRUE, "yes", "no"))) %>%
      datatable(filter = "top",
                options = list(
                  columnDefs = list(
                    list(
                      targets = c(3),
                      render = JS(
                        "function(data, type, row, meta) {",
                        "  if(type === 'display'){",
                        "    return data == \"yes\" ? '<input type=\"checkbox\" disabled checked/>' : '<input type=\"checkbox\" disabled/>';",
                        "  }",
                        "  return data;",
                        "}"
                      )
                    ))
                )
      )
  )
}

shinyApp(ui, server)