有什么方法可以向DT中的按钮添加自定义R功能操作?

时间:2018-11-17 13:27:08

标签: r datatables dt

我正在尝试向我的数据表添加一个自定义按钮,以执行R函数定义的操作。我在R代码中使用的选项列表与Datatables manual中的Javascript代码中使用的选项列表相同,但是不起作用。

这是Datatables manual中的代码:

$(document).ready(function() {
    $('#example').DataTable( {
        dom: 'Bfrtip',
        buttons: [
            {
                text: 'My button',
                action: function ( e, dt, node, config ) {
                alert( 'Button activated' );
                }
            }
        ]
    } );
} );

这是我在R中的代码:

require(DT)
DT::datatable(iris,
    extensions = 'Buttons',
    options = list(
        dom = 'Bfrtip',
        buttons = list(
            list(
                text = 'test',
                action = print('1')
                )
        )
    )
)

执行它,我收到一个错误:

Error in if (extend != "collection") extend else listButtons(cfg) : 
  argument is of length zero

1 个答案:

答案 0 :(得分:1)

您必须像这样设置extend = "collection"

library(DT)
datatable(iris,
          extensions = 'Buttons',
          options = list(
            dom = 'Bfrtip',
            buttons = list(
              "copy",
              list(
                extend = "collection",
                text = 'test',
                action = DT::JS("function ( e, dt, node, config ) {
                                    alert( 'Button activated' );
                                }")
              )
            )
          )
)

但是该操作只能执行一些Javascript,而不能执行R命令。但是,如果您将数据表放在闪亮的应用程序中,则可以通过单击自定义按钮来执行R命令。像这样:

library(shiny)
library(DT)

ui <- basicPage(
  DTOutput("dtable")
)

server <- function(input, output, session){
  output$dtable <- renderDT(
    datatable(iris,
              extensions = 'Buttons',
              options = list(
                dom = 'Bfrtip',
                buttons = list(
                  "copy",
                  list(
                    extend = "collection",
                    text = 'test',
                    action = DT::JS("function ( e, dt, node, config ) {
                                      Shiny.setInputValue('test', true);
                                   }")
                  )
                )
              )
    )
  )

  observeEvent(input$test, {
    if(input$test){
      print("hello")
    }
  })
}

shinyApp(ui, server)