R Блестящий — вложенный модуль не запускает события на сервере

#r #shiny #module

#r #блестящий #модуль

Вопрос:

Я пытаюсь создать приложение R Shiny, для которого требуются вложенные модули. Мой код работает при вызове одного вложенного модуля, но терпит неудачу, когда я иду на один уровень глубже. ui Компонент создается без проблем, Но кнопки и т. Д. Не Работают в этом модуле.

Я приложил простой пример. Здесь, когда вы нажимаете первую кнопку, он вызывает модуль и создает вторую кнопку внутри wellPanel . Затем это повторяется, если нажата эта вторая кнопка. Однако я ожидал бы, что при нажатии третьей кнопки я получу строку

Нажата третья кнопка

выводится на экран.

Есть предложения?

 library(shiny)

# Second Level Mod --------------------------------------------------------

second_mod_ui <- function(id) {
  ns <- shiny::NS(id)
  fluidPage(
    wellPanel(
      actionButton(ns('addButton3'), '', icon = icon('plus'))
    )
  )
}

second_mod_server <- function(input, output, session) {
  observeEvent(input$addButton3, {
    print("Third button Pressed")
  })
}


# First Level Mod ---------------------------------------------------------------


first_mod_ui <- function(id) {
  ns <- shiny::NS(id)
  shiny::uiOutput(ns("showButton"))
}

first_mod_server <- function(input, output, session) {
  
  ns <- session$ns
  output$showButton <- renderUI({
    
    fluidPage(
      wellPanel(
        actionButton(ns('addButton2'), '', icon = icon('plus'))
      )
    )
  })
  
  observeEvent(input$addButton2, {
    i <- sprintf('d', input$addButton2)
    id <- sprintf('Button2%s', i)
    
    insertUI(
      selector = paste0('#', ns("addButton2")),
      where = "beforeBegin",
      ui = second_mod_ui(id)
    )
    
    callModule(second_mod_server, id)
  })
}

# Main App ----------------------------------------------------------------

ui <- fluidPage(
  br(),
  actionButton('addButton1', '', icon = icon('plus'))
)

server <- function(input, output) {
  
  # If the Plus button has been pressed
  observeEvent(input$addButton1, {
    
    # Create a new id
    i <- sprintf('d', input$addButton1)
    id <- sprintf('Button1%s', i)
    
    # Insert the new UI
    insertUI(
      selector = '#addButton1',
      where = "beforeBegin",
      ui = first_mod_ui(id)
    )
    
    # Call the server
    callModule(first_mod_server, id)
  })
}

shinyApp(ui = ui, server = server)
 

Комментарии:

1. В чем смысл использования, если я могу спросить? В прошлом я довольно часто использовал Shiny, однако мне редко требовались модули и никогда не были вложенными. Это не значит, что это неправильно. Однако мне любопытно узнать причину :-).

2. Попытка включения ns в вызов second_mod_ui , например ui = second_mod_ui(ns(id))

3. @Shamis. В основном первый позволит пользователю добавлять несколько блоков анализа (т.е. Нажмите добавить, и будет сгенерировано новое поле). Это поле будет одинаковым для каждого и, следовательно, для использования модуля. В каждом поле требуется добавить динамическое количество переменных, для каждой из которых требуются одинаковые входные данные (т.Е. Имя, тип и т.д.) Это можно рассматривать как форму. Таким образом, каждая новая переменная — это новая форма для заполнения. Надеюсь, это поможет.

4. @Ben Я считаю, что это могло быть так! Это, безусловно, работает в моем показанном примере. Я действительно ценю вашу помощь в этом.