r - 如何在 DT 数据表行中选择 html 选择输入小部件? R

标签 r shiny datatables dt

我有以下 Shiny 的应用程序。

# GLOBAL ----
library(shiny)
library(DT)
library(readr)
library(dplyr)

SELECT = '<select year="" id="year-select">
    <option value="">--Please choose an option--</option>
    <option value="2014">2014</option>
    <option value="2015">2015</option>
    <option value="2016">2016</option>
</select>'



test_cars <- data.frame("Num" = c(1:5),
                        "Make" = c("Toyota","","","",""),
                        "Model" = c("Camry","","","",""))

test_cars$Year <- SELECT

# UI ----
ui <- navbarPage(
  title = 'Cars Editor',
  tabPanel("Cars Entry",DTOutput("table1")),
  tabPanel("About")
)

# SERVER ----
server <- function(input, output) {
  output$table1 <- renderDT({
    datatable(test_cars %>% select(!Num), editable = "all", escape = FALSE, extensions = 'Buttons',
              options = list(
                dom = 'Bfrtip',
                buttons =
                  list('copy', 'print', list(
                    extend = 'collection',
                    buttons = c('csv', 'excel', 'pdf'),
                    text = 'Download'
                  ))

              )
    )
  })

}
# Run app ----
shinyApp(ui = ui, server = server)

这给了我以下信息:我的目标是让用户从“年份”列中选择一个输入并将其保存到数据中。

enter image description here

但是当我点击下载时,我得到了 html 选择输入中的所有选项,而不是用户的选择。关于我应该如何处理这个问题有什么想法吗?

enter image description here

最佳答案

这可以通过一些自定义导出选项来完成。

library(shiny)
library(DT)
library(readr)
library(dplyr)

SELECT = '<select year="" id="year-select">
    <option value="">--Please choose an option--</option>
    <option value="2014">2014</option>
    <option value="2015">2015</option>
    <option value="2016">2016</option>
</select>'



test_cars <- data.frame("Num" = c(1:5),
                        "Make" = c("Toyota","","","",""),
                        "Model" = c("Camry","","","",""))

test_cars$Year <- SELECT

# UI ----
ui <- navbarPage(
    title = 'Cars Editor',
    tabPanel("Cars Entry",DTOutput("table1")),
    tabPanel("About")
)

# SERVER ----
server <- function(input, output) {
    output$table1 <- renderDT({
        datatable(test_cars %>% select(!Num), editable = "all", escape = FALSE, extensions = 'Buttons',
                  options = list(
                      dom = 'Bfrtip',
                      buttons =
                          list('copy', 'print', list(
                              extend = 'collection',
                              text = 'Download',
                              buttons = list('csv', 'excel', list(
                                  extend = "pdf",
                                  exportOptions = list(
                                      format = list(
                                          body = JS(
                                            "
                                              function(data, row, col, node) {
                                                  return $(node).has('select').length ?
                                                    $(node).find(':selected').text(): data
                                              }
                                            "
                                          )
                                      )
                                  )
                              ))
                          ))
                      
                  )
        )
    })
    
}

# Run app ----
shinyApp(ui = ui, server = server)
  1. 本文以 pdf 导出选项为例,您可以对其他导出选项执行相同的操作。
  2. 在导出数据时,我们添加了一个自定义 JS 函数来告诉 datatable 如何呈现 body
  3. 它检查单元格内是否有 select 标签,如果是,则从下拉列表中获取所选值,否则返回原始值。

阅读buttons.exportData了解详情。

enter image description here

enter image description here

关于r - 如何在 DT 数据表行中选择 html 选择输入小部件? R,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74269142/

相关文章:

R Shiny - 如何通过 checkboxGroupInput 进行过滤

r - 当输入更改(例如,选项卡更改)时,我如何告诉我的 modalDialog 自动关闭?

javascript - 在数据表中单击按钮后如何获取行数据

jquery - 如何获得表行与 Angular 7 中最后两个值的差异?

r - rouge 语法突出显示是为了突出显示 R 中的非基本函数吗?

R:每个 ID 自上次事件以来的天数

r - 从 Shiny (R) 下载 png

r - 在 R Shiny 中,如何取消选中复选框输入以引发操作?

正则表达式:在 R 中使用 `u` 标志

javascript - Datatables.js 将单元格值投影到构面中