1

以下のコードの例では、数値入力と、行にボタンがあるデータ テーブルを含む単純な ShinyApp を生成します。数値入力と同じデータ テーブルの行数。また、すべてのボタンが監視され、押されたときにアラートが生成されます。

library(shiny)
library(DT)
library(shinyjs)

exampleModuleUI <- function(id) {
    ns <- NS(id)

    DT::DTOutput(ns("table"))
}

exampleModule <- function(input, output, session, max.index) {
    ns <- session$ns

    output$table <- renderDataTable(
        data.frame(
            buttons = unlist(
                lapply(
                    1:max.index, 
                    function(index) {
                        as.character(
                            actionButton(
                                ns(as.character(index)), 
                                as.character(index)
                            )
                        )
                    }
                )
            )
        ),
        escape = FALSE, 
        style = 'bootstrap',
        extensions = 'FixedColumns',
        options = list(
            preDrawCallback = JS('function() { Shiny.unbindAll(this.api().table().node()); }'),
            drawCallback = JS('function() { Shiny.bindAll(this.api().table().node()); } ')
        )
    )

    lapply(
        1:max.index, 
        function(index) {
            observeEvent(input[[as.character(index)]], {
                shinyjs::alert(as.character(index))
            })
        }
    )
}

ui <- fixedPage(
    useShinyjs(),
    numericInput(
        "count", 
        "Count of button in table",
        value = 3,
        min = 3, 
        max = 7, 
        step = 1
    ),
    exampleModuleUI("dt.table")
)

server <- function(input, output, session) {
    max.count <- reactive({
        input$count
    })

    observeEvent(
        max.count(), {
            callModule(exampleModule, "dt.table", max.count())
        }
    )
}

shinyApp(ui, server)

問題
数値入力で、たとえば最初に「7」を入力し、次に「6」を入力してからもう一度「7」を入力すると、ボタンが 1 つも表示されなくなります。モジュールを再度呼び出すと何か問題が発生するようですが、特定の理由は不明です。しかし、最も興味深い質問は「どうやってそれを機能させるか」です。

4

1 に答える 1