为什么我们在 Shiny 模块中使用 session$ns 而不是 NS(id) ?

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)

pie*_*ito 3

为什么?

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)

另请参阅这个答案