微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

R Shiny Datatable中的嵌入式输入-javascript问题

如何解决R Shiny Datatable中的嵌入式输入-javascript问题

我有一个R / Shiny应用,其中包含DT程序包中的数据表。

在该线程render dropdown for single column in DT shiny之后,我已经能够将动作按钮嵌入到数据表的一列中,从而触发一组相应的观察者。

但是,在对数据表进行分页时,我的操作按钮将仅对第一页上的那些按钮正确起作用。后续页面上的按钮不起作用。即使我使用列排序对数据进行重新排序,情况依然如此,因为即使初始按钮在页面1+上重新排序,第2+页以上的任何按钮也将不起作用。

我希望问题出在回调参数如何使用javascript(不幸的是我的头)如何正确呈现操作按钮。谁能建议如何在后续页面上使用操作按钮?

这是我使用mtcars数据的最小代表:

library(shiny)
library(DT)

ui <- fluidPage(
    titlePanel("reprex1"),fluidRow(
        dataTableOutput("dt1")
    )
)

server <- function(input,output) {
    output$dt1 <- renderDataTable({
        mtlocal <- mtcars
        for(n in 1:nrow(mtlocal)){
            mtlocal$actionbutton[[n]] <- as.character(
                actionButton(
                    paste0("buttonpress",n),label = paste0("buttonpress",n)
                )
            )
        }
        datatable(
            mtlocal,escape = FALSE,selection = "none",callback = JS("table.rows().every(function(i,tab,row) {
        var $this = $(this.node());
        $this.attr('id',this.data()[0]);
        $this.addClass('shiny-input-container');
      });
      Shiny.unbindAll(table.table().node());
      Shiny.bindAll(table.table().node());")
        )
    },server = FALSE)

    lapply(
        1:nrow(mtcars),function(x){
            observeEvent(
                input[[paste0("buttonpress",x)]],{
                    showModal(
                        modalDialog(
                            h2(paste0("You clicked on button ",x,"!"))
                        )
                    )
                }
            )       
        }
    )
}

# Run the application 
shinyApp(ui = ui,server = server)

解决方法

callback仅执行一次,然后Shiny.bind/unbind在重绘表时丢失。您必须使用选项preDrawCallbackdrawCallback

datatable(
  mtlocal,escape = FALSE,selection = "none",options = list(
    preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
  )
)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。