【问题标题】:Shiny - Change column names in DT table for storing as reactiveValShiny - 更改 DT 表中的列名以存储为 reactiveVal
【发布时间】:2020-10-07 00:11:10
【问题描述】:

我有一个带有 DT 数据表的 Shiny 应用程序,我可以在其中通过 Javascript 更改列名(感谢另一个 Stackoverflow 条目)。我想将更改后的列名存储在 reactiveVal 中。但是,这目前不起作用。

这是我当前使用的代码:

library(shiny)
library(DT)

callback <- c(
  "table.on('dblclick.dt', 'thead th', function(e) {",
  "  var $th = $(this);",
  "  var index = $th.index();",
  "  var colname = $th.text(), newcolname = colname;",
  "  var $input = $('<input type=\"text\">')",
  "  $input.val(colname);",
  "  $th.empty().append($input);",
  "  $input.on('change', function(){",
  "    newcolname = $input.val();",
  "    if(newcolname != colname){",
  "      $(table.column(index).header()).text(newcolname);  ",
  "      Shiny.onInputChange('newColumnValue', newcolname);",
  "      console.log( newcolname);",
  "    }",
  "    $input.remove();",
  "  }).on('blur', function(){",
  "    $(table.column(index).header()).text(newcolname);",
  "    $input.remove();",
  "  });",
  "});"
 )

 ui <- fluidPage(
   textOutput("value"),
   tags$head(
   tags$link(rel = "stylesheet", href = "https://cdnjs.cloudflare.com/ajax/libs/jquery-   contextmenu/2.8.0/jquery.contextMenu.min.css"),
   tags$script(src = "https://cdnjs.cloudflare.com/ajax/libs/jquery-contextmenu/2.8.0/jquery.contextMenu.min.js")
  ),
  DT::dataTableOutput("table")

)

server <- function(input, output){
  val <- reactiveVal(NULL) 

  mydata <- reactive({
    browser()
    data <- datatable(iris[1:3,], callback = JS(callback))
    val(colnames(data$x$data))
    data
  })

  output$table <- DT::renderDataTable({
    mydata()
  }, server = FALSE) 

  output$value <- renderText({
    val()                     
    })
 }

 shinyApp(ui, server)

但是,我的 reactiveVal 变量没有任何变化。我需要改变什么?

干杯, 安迪

【问题讨论】:

    标签: r shiny shiny-reactivity


    【解决方案1】:
    library(shiny)
    library(DT)
    
    callback <- c(
      "var colnames = table.columns().header().to$().map(function(){return this.innerHTML;}).get();",
      "Shiny.onInputChange('colnames', colnames);",
      "table.on('dblclick.dt', 'thead th', function(e) {",
      "  var $th = $(this);",
      "  var index = $th.index();",
      "  var colname = $th.text(), newcolname = colname;",
      "  var $input = $('<input type=\"text\">')",
      "  $input.val(colname);",
      "  $th.empty().append($input);",
      "  $input.on('change', function(){",
      "    newcolname = $input.val();",
      "    if(newcolname != colname){",
      "      $(table.column(index).header()).text(newcolname);",
      "      colnames[index] = newcolname;",
      "      Shiny.onInputChange('colnames', colnames);",
      "    }",
      "    $input.remove();",
      "  }).on('blur', function(){",
      "    $(table.column(index).header()).text(newcolname);",
      "    $input.remove();",
      "  });",
      "});"
    )
    
    ui <- fluidPage(
      verbatimTextOutput("colnames"),
      DTOutput("table")
    )
    
    server <- function(input, output){
    
      output$table <- renderDT({
        datatable(iris[1:3,], callback = JS(callback), 
                  options = list(ordering = FALSE))
      }, server = FALSE) 
    
      output$colnames <- renderPrint({
        input$colnames                     
      })
    }
    
    shinyApp(ui, server)
    

    【讨论】:

      猜你喜欢
      • 2019-01-10
      • 2023-03-22
      • 2020-06-24
      • 2016-09-08
      • 2018-08-16
      • 2018-03-04
      • 2021-09-01
      • 2018-03-18
      • 2021-08-04
      相关资源
      最近更新 更多