首页 > 解决方案 > 动态创建的辅助表中的闪亮观察事件

问题描述

我使用了一个 observeEvent 来捕捉用户在表格行中单击并获取行 ID 以显示一个新选项卡,其中包含所选类别的数据的向下钻取。我希望能够在新创建的表中执行相同的操作以显示与特定选定案例相对应的数据详细信息,但我不知道如何引用动态创建的表。

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

ui <- fluidPage(
    titlePanel("Old Faithful Geyser Data"),
    sidebarLayout(
        sidebarPanel(
            dateRangeInput(inputId="daterange",label = "Date Range",start = "2019-09-01")
        ),

        mainPanel(
            tabsetPanel( id = "tabs",
                         tabPanel("Table",
                                  dataTableOutput("summary"))
            )
        )
    )
)


tabledata <- as_data_frame(
    bind_cols(
        value = c(3,6,9,2,6,8,3),
        category=c("blue","red","green","blue","green","green","red")
    )
)


server <- function(input, output) {

    categories_summary <- reactive({ 
        tabledata %>% 
            group_by(category) %>% 
            summarise(mean=mean(value),median=median(value)) %>% 
            ungroup()
    })

    output$summary <- DT::renderDataTable({
        categories_summary()
    })

    tab_list <- NULL

    observeEvent(input$summary_rows_selected,{  
        shiny::validate(
            need(length(input$summary_rows_selected) > 0, "Select rows to drill down!")
        )

        step <- input$summary_rows_selected[length(input$summary_rows_selected)]

        tab_title <- paste(categories_summary()[step, ]$category)

        if(tab_title %in% tab_list == FALSE){
            t1 <- tabledata[tabledata$category ==categories_summary()[step, ]$category, ]

            appendTab(inputId = "tabs",
                      tabPanel(
                          tab_title,
                          DT::renderDataTable(t1)
                      ))

            tab_list <<- c(tab_list, tab_title) 
        }
    })
}

shinyApp(ui = ui, server = server)

谢谢

我找到了一个可能的解决方案,通过以下方式添加一个 jQuery 观察者:

<script type="text/javascript">
$('body').on('click','div[data-value="blue"] table tbody',
        function (e) {
    e = e || window.event;
    var data = [];
    var target = e.srcElement || e.target;
    while (target && target.nodeName !== "TR") {
        target = target.parentNode;
    }
    if (target) {
        var cells = target.getElementsByTagName("td");
        for (var i = 0; i < cells.length; i++) {
            data.push(cells[i].innerHTML);
        }
    }

    console.log(data[0],data[1],data[2]);
}
);
</script>

它似乎运行正常。我想我可以解决这个问题。

标签: rshinydt

解决方案


非常有趣的概念,我想知道一旦你将它发送到 UI,你是否会有一个新的选项卡可以在服务器内部引用?不确定这是否适用于新的 JS。也许你可以有颜色的复选框,然后只更新表格,并有多个选项卡用于不同的选择


推荐阅读