以下のコードの例では、数値入力と、行にボタンがあるデータ テーブルを含む単純な 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 つも表示されなくなります。モジュールを再度呼び出すと何か問題が発生するようですが、特定の理由は不明です。しかし、最も興味深い質問は「どうやってそれを機能させるか」です。