创建的闪亮子模块服务器 ui 元素未出现在输入列表中
Shiny submodule server created ui elements do not appear on input list
我在我闪亮的应用程序中使用模块。但是,如果我嵌套我的模块,我无法让 ui 从在模块服务器部分中创建的 ui 元素发回信息。在 ui-section 中创建的 ui-elements 没有问题,只有在 server-section 中创建的元素才有问题。
同一个模块没有问题,如果我不嵌套的话
这是一个小例子,我在其中显示 table 和来自 input$
的数据
library(shiny)
# Selection module ----
select_module_ui <- function(id){
tagList(
selectInput(inputId = NS(id, "select1"),
label = "Select 1 from ui-section",
choices = c("Denmark", "Germany"),
selected = "Denmark"),
htmlOutput(outputId = NS(id, "select2_ui")),
tableOutput(outputId = NS(id, "myinputs"))
)
}
select_module_server <- function(id) {
moduleServer(id, function(input, output, session) {
all_inputs <- reactive({
myvalues <- NULL
for(i in 1:length(names(input))){
myvalues <- as.data.frame(rbind(myvalues,(cbind(names(input)[i],input[[names(input)[i]]]))))
}
names(myvalues) <- c("User Input","Last Value")
myvalues
})
output$select2_ui <- renderUI({
selectInput(inputId = NS(id, "select2"),
label = "Select 2 from server-section",
choices = c("Denmark", "Germany"),
selected = "Denmark")
})
output$myinputs <- renderTable({all_inputs()})
})
}
# Container module -----
container_module_ui <- function(id){
select_module_ui(id = NS(id, "select_module"))
}
container_module_server <- function(id) {
moduleServer(id, function(input, output, session) {
select_module_server(id = "select_module")
})
}
# Application -----
ui <- fluidPage(
h2("As a normal module"),
select_module_ui(id = "select_module_normal"),
hr(),
h2("As a submodule within a module"),
container_module_ui(id = "container_module")
)
server <- function(input, output, session) {
select_module_server(id = "select_module_normal")
container_module_server(id = "container_module")
}
shinyApp(ui, server)
不嵌套时是input$
的信息。嵌套时无信息
我怀疑我在 module_container_server
中使用 NS(id, ...)
调用有问题,但其他服务器元素显示正确(selectInput
和 renderTable
).使用 NS(id, ...)
调用 select_server
无效
container_module_server <- function(id) {
moduleServer(id, function(input, output, session) {
select_module_server(NS(id, "select_module"))
})
}
谢谢,
拉斯
如果你需要在服务器中使用NS()
,那么你需要session$ns()
:
output$select2_ui <- renderUI({
selectInput(inputId = session$ns("select2"),
label = "Select 2 from server-section",
choices = c("Denmark", "Germany"),
selected = "Denmark")
})
我在我闪亮的应用程序中使用模块。但是,如果我嵌套我的模块,我无法让 ui 从在模块服务器部分中创建的 ui 元素发回信息。在 ui-section 中创建的 ui-elements 没有问题,只有在 server-section 中创建的元素才有问题。
同一个模块没有问题,如果我不嵌套的话
这是一个小例子,我在其中显示 table 和来自 input$
library(shiny)
# Selection module ----
select_module_ui <- function(id){
tagList(
selectInput(inputId = NS(id, "select1"),
label = "Select 1 from ui-section",
choices = c("Denmark", "Germany"),
selected = "Denmark"),
htmlOutput(outputId = NS(id, "select2_ui")),
tableOutput(outputId = NS(id, "myinputs"))
)
}
select_module_server <- function(id) {
moduleServer(id, function(input, output, session) {
all_inputs <- reactive({
myvalues <- NULL
for(i in 1:length(names(input))){
myvalues <- as.data.frame(rbind(myvalues,(cbind(names(input)[i],input[[names(input)[i]]]))))
}
names(myvalues) <- c("User Input","Last Value")
myvalues
})
output$select2_ui <- renderUI({
selectInput(inputId = NS(id, "select2"),
label = "Select 2 from server-section",
choices = c("Denmark", "Germany"),
selected = "Denmark")
})
output$myinputs <- renderTable({all_inputs()})
})
}
# Container module -----
container_module_ui <- function(id){
select_module_ui(id = NS(id, "select_module"))
}
container_module_server <- function(id) {
moduleServer(id, function(input, output, session) {
select_module_server(id = "select_module")
})
}
# Application -----
ui <- fluidPage(
h2("As a normal module"),
select_module_ui(id = "select_module_normal"),
hr(),
h2("As a submodule within a module"),
container_module_ui(id = "container_module")
)
server <- function(input, output, session) {
select_module_server(id = "select_module_normal")
container_module_server(id = "container_module")
}
shinyApp(ui, server)
不嵌套时是input$
的信息。嵌套时无信息
我怀疑我在 module_container_server
中使用 NS(id, ...)
调用有问题,但其他服务器元素显示正确(selectInput
和 renderTable
).使用 NS(id, ...)
select_server
无效
container_module_server <- function(id) {
moduleServer(id, function(input, output, session) {
select_module_server(NS(id, "select_module"))
})
}
谢谢, 拉斯
如果你需要在服务器中使用NS()
,那么你需要session$ns()
:
output$select2_ui <- renderUI({
selectInput(inputId = session$ns("select2"),
label = "Select 2 from server-section",
choices = c("Denmark", "Germany"),
selected = "Denmark")
})