0

lapply で作成されたボタンのリストに依存するアプリを構築しようとしています。モジュール化されたコードを使用していない場合でも、observeEvent を使用してボタンを正常に参照できます。ただし、モジュールを使用しようとすると、observeEvent が機能しません。Shiny が名前空間 ID を処理する方法に関係があると思われますが、数日間の実験にもかかわらず、問題を解決できませんでした。

以下に、最初に動作するモジュール化されていないダミーアプリを投稿します (この他のスタックオーバーフローの質問から盗まれました: R Shiny: How to write loop for observeEvent )。次に、動作しない既存のモジュール化されたコードを共有します。

モジュール化されていないコードの作業:

library("shiny")
ui <- fluidPage(
  fluidRow(
    column(
      width = 6,
      lapply(
        X = 1:6,
        FUN = function(i) {
          sliderInput(inputId = paste0("d", i), label = i, min = 0, max = 10, value = i)
        }
      )
    ),
    column(
      width = 6,
      verbatimTextOutput(outputId = "test")
    )
  )
)
server <- function(input, output){

  vals <- reactiveValues()

  lapply(
    X = 1:6,
    FUN = function(i){
      observeEvent(input[[paste0("d", i)]], {
        vals[[paste0("slider", i)]] <- input[[paste0("d", i)]]
      })
    }
  )

  output$test <- renderPrint({
    reactiveValuesToList(vals)
  })
}
shinyApp(ui = ui, server = server)

失敗するモジュール化されたコード:

library(shiny)

slidersUI <- function(id){
  ns <- NS(id)
  tagList(

  fluidRow(
    column(
      width = 6,
      lapply(
        X = 1:6,
        FUN = function(i) {
          sliderInput(inputId = paste0("d", i), label = i, min = 0, max = 10, value = i)
        }    ),
    column(
      width = 6,
      verbatimTextOutput(outputId = "test")
    )

    
  )))
}

slidersServer <- function(input, output, session){
  vals <- reactiveValues()

    lapply(
    X = 1:6,
    FUN = function(i){
      output$test2 <- renderText(paste0("this is i:", i))
      observeEvent(input[[paste0("d", i)]], {
        vals[[paste0("slider", i)]] <- input[[paste0("d", i)]]
      })
    }
  )
  
  output$test <- renderPrint({
    reactiveValuesToList(vals)
  })
  
}


library("shiny")
ui <- fluidPage(
  slidersUI("TheID")
  
)
server <- function(input, output){
  callModule(slidersServer, "TheID")
}
shinyApp(ui = ui, server = server)

ありがとうございました!

4

1 に答える 1