Sté*_*ent 8 r shiny shinymodules
考虑我们在服务器部分使用的任何 Shiny 模块session$ns,例如下面的模块。
我们可以等效地使用NS(id)来代替session$ns. 那么为什么推荐使用session$ns呢?相比有优势吗NS(id)?
library(shiny)
myModuleUI <- function(id){
ns <- NS(id)
uiOutput(ns("checkbox"))
}
myModuleServer <- function(id){
moduleServer(id, function(input, output, session){
ns <- session$ns
output[["checkbox"]] <- renderUI({
checkboxInput(ns("checkbox"), label = "Check me", value = FALSE)
})
observe({
print(input[["checkbox"]])
})
})
}
ui <- basicPage(
myModuleUI("myModule")
)
server <- function(input, output, session){
myModuleServer("myModule")
}
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
session$ns如果您想使用使用动态 UI 的嵌套模块,则这是强制性的uiOutput
library(shiny)
## NESTED MODULE
nestedModuleUI <- function(id) {
ns <- NS(id)
uiOutput(ns("ui_out"))
}
nestedModuleServer <- function(id) {
moduleServer(
id,
function(input, output, session) {
output$ui_out <- renderUI({
list(
actionButton(session$ns("well_formed"), "I work"),
actionButton(NS(id, "bad_formed"), "I do nothin'")
)
})
observeEvent(input$well_formed, print("button pressed!"))
observeEvent(input$bad_formed, print("button pressed!"))
}
)
}
## CONTAINER MODULE
containerModuleUI <- function(id) {
ns <- NS(id)
nestedModuleUI(ns("nested"))
}
containerModuleServer <- function(id) {
moduleServer(
id,
function(input, output, session) {
nestedModuleServer("nested")
}
)
}
## Application
ui <- containerModuleUI("container")
server <- function(input, output, session) containerModuleServer("container")
shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)
另请参阅这个答案