添加下载按钮破坏了 R 中数据表的文本 truncation/hover 功能

Add download buttons is breaking my text truncation/hover functionality for a datatable in R

我正在尝试使用 R 的 DT 包显示数据集,它允许您呈现 javascript 数据表。其中两列包含很长的文本,因此我的同事编写了一些 JS 来截断文本,同时让您在将鼠标悬停在单元格上时看到整个文本。我们还希望用户能够点击下载按钮来过滤什么。但是,当我添加代码来制作下载按钮时,它会破坏文本截断。我想以某种方式截断文本并下载数据。

函数如下:

library(DT)

render_dt <- function(.data)) {

  .data %>%
    datatable(caption = "Major Thrusts (hover for full text)",
              ############### If you get rid of these lines the javascript code works #############
              extensions = 'Buttons',
              escape = FALSE,
              options = list(dom = 'Bfrtip',
                             buttons = c('csv', 'excel')
                             ),
              ######################                                                  #############
              list(columnDefs = list(list(
                targets = c(7, 8),
                render = JS(
                  "function(data, type, row, meta) {",
                  "return type === 'display' && data.length > 100 ?",
                  "'<span title=\"' + data + '\">' + data.substr(0, 100) + '...</span>' : data;",
                  "}"
                )))))

}

我也尝试过将按钮添加为文字 javasript,但我收到一个错误,提示 JS() 输入需要是字符串向量。像这样:

render_dt <- function(.data)) {

  .data %>%
    datatable(caption = "Major Thrusts (hover for full text)",
              list(columnDefs = list(list(
                targets = c(7, 8),
                render = JS(
                  "function(data, type, row, meta) {",
                  "return type === 'display' && data.length > 100 ?",
                  "'<span title=\"' + data + '\">' + data.substr(0, 100) + '...</span>' : data;",
                  "}"
                ))))) %>% 
    JS(".DataTable({",
       "dom: 'Bfrtip',",
       "buttons: [",
       "'copy', 'csv', 'excel'",
       "]",
       "})")

}

下面是一些示例数据:

structure(list(Service = structure(c(9L, 5L), .Label = c("Defense Logistics Agency", 
"Defense Information Systems Agency", "United States Special Operations Command", 
"Office of the Secretary Of Defense", "Missile Defense Agency", 
"Defense Advanced Research Projects Agency", "Navy", "Army", 
"Air Force"), class = "factor"), `Program Element` = c("GPS IIIC", 
"Ballistic Missile Defense Command and Control, Battle Management & Communication"
), Year = c(2019, 2020), Spending = c(451.889, 317.731), `Project Title` = c("GPS IIIC", 
"Command & Control, Battle Management, Communications (C2BMC)"
), `Thrust Title` = c("GPS III Follow-On Development", "C2BMC Development and Deployment"
), `Thrust Description` = c("The program will utilize RDT&E funds to develop and deliver SV11 12, conduct the non recurring engineering (NRE) of developing risk reducing simulators, support test equipment, and conducting the systems engineering associated with delivering the new capabilities required of GPS III Follow On including backward compatibility, dual band TT&C, integration of Government Furnished Equipment (GFE) hosted payloads, and Regional Military Protection (RMP), which provides the ability to deliver high power regional M Code signals in specific areas of intended effect.", 
"Provides funding for incremental development and deployment of C2BMC capabilities that link sensors and shooters to enable integrated BMDS capabilities, integrate BOA with the BMDS architecture to enhance missile tracking capabilities and enable much earlier cueing of radars and shooters, and fulfill Cybersecurity requirements.  The Enterprise Sensors Laboratory (ESL) and Experimentation Laboratory (X Lab) produce key prototypes for further maturation in the C2BMC capability Spiral development process and enables integrated experimentation for C2BMC, ESL, OPIR products, and other BMDS elements through robust connectivity to simulation frameworks, weapon systems, sensors, and operational assets. Recurring accomplishments include iterative development and procurement cycles for hardware, software, network capability system engineering tasks, and artifacts for technical engineering reviews; participation in test readiness reviews, pre test engineering and analysis of ground and flight test results, wargames, and exercises in accordance with the BMDS Integrated Master Test Plan (IMTP); site planning, scheduling and hardware acquisition to support planned deployment of C2BMC Spirals and BMDS Overhead Persistent Infra Red (OPIR) Architecture (BOA) capabilities; updates and maintenance for C2BMC Model (BCM) BMDS simulation/stimulation (federated model) and verification scenarios for all C2BMC Spirals deployed and under development; prototyping and characterizing BOA, Discrimination, operationalization of SKA as part of Post Intercept Assessment (PIA): prototyping Robust PIA and C2BMC capabilities; design, installation and sustainment of operational sharing gateways; and collaboration with international partners to ensure future interoperability.  Specific and/or unique accomplishments for each FY are as follows:"
), Plans = c("Program office will award the Phase 2 contract in early FY 2019.  Upon contract award, the program will initiate efforts to prepare for and conduct Critical Design Review (CDR), continue development of SV11 12, and prepare for Milestone C in early 2020. Rapidly respond to implement system resiliency and situational awareness necessary to operate in the contested space domain. Activities may include, but are not limited to program office support, studies, technical analysis, prototyping, etc.", 
"EPAA Phase 3 / EOR (Spiral 8.2 3):   Maintain ability to develop/deploy capability in response to emergent operational requirements  LRDR for Homeland Defense (Spiral 8.2 5), homeland defense focus:   Continue iterative software coding, unit testing, and interoperability testing of Spiral 8.2 5 capabilities, including LRDR and hypersonic threat detection and tracking   Initiate iterative software coding, unit testing, and interoperability testing for BMDS integration with the Integrated Air and Missile Defense (IAMD) Battle Command System (IBCS)   Support developmental testing and preparation of transfer of the LRDR to the Air Force   Continue deployment of hardware and software to provide LRDR BMDS network connectivity and sensor control nodes   Increase Verification and Validation in support of BMDS capability ground testing and participation in BMDS ground tests   C2BMC Additional and Expanded Regional and Homeland Defense focus:   Design and prototype the next incremental capability addressing Additional Homeland Defense and Mid Term Discrimination requirements, inclusive of C2BMC Generation of BMD System Track (with System Level Discrimination Data Integration) for GMD Homeland Defense Engagements and Expanded Regional and Homeland Defense, inclusive of the integration of the Homeland Defense Radar Hawaii (HDR H) and an expanded interface with the OPIR enterprise, which yields additional raid handling capacity, enhanced Aegis BMD engage on capability, and expanded hypersonic defense tracking and reporting    Continue operationalization of Space based Kill Assessment (SKA) as part of PIA   Continue planning and prototyping tasks for Robust BMDS Post Intercept Assessment (PIA)   Initiate design and development of accredited models and simulations (M&S) for C2BMC and BOA spirals for participation in End to end Digital Integrated System Simulation (EDISS)   Continue design and development of Ground Test Integrated System level Simulation (GTISS)"
)), row.names = c(NA, -2L), class = c("tbl_df", "tbl", "data.frame"
))

columnDefs 必须在 options 列表中:

datatable(
  caption = "Major Thrusts (hover for full text)",
  extensions = 'Buttons',
  escape = FALSE,
  options = list(
    dom = 'Bfrtip',
    buttons = c('csv', 'excel'),
    columnDefs = list(
      list(
        targets = c(7, 8),
        render = JS(
          "function(data, type, row, meta) {",
          "return type === 'display' && data.length > 100 ?",
          "'<span title=\"' + data + '\">' + data.substr(0, 100) + '...</span>' : data;",
          "}"
        )
      )
    )
  )
)

请注意,您可以使用 ellipsis 插件来获得相同的结果:

datatable(
  caption = "Major Thrusts (hover for full text)",
  extensions = 'Buttons',
  plugins = "ellipsis",
  escape = FALSE,
  options = list(
    dom = 'Bfrtip',
    buttons = c('csv', 'excel'),
    columnDefs = list(
      list(
        targets = c(7, 8),
        render = JS("$.fn.dataTable.render.ellipsis( 100, false )")
      )
    )
  )
)