#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 Я считаю, что это могло быть так! Это, безусловно, работает в моем показанном примере. Я действительно ценю вашу помощь в этом.