了解 R Shiny 模块:shiny::NS(id) 中的错误:缺少参数 "id",没有默认值

Understanding R Shiny modules: Error in shiny::NS(id) : argument "id" is missing, with no default

我正在尝试理解闪亮模块的概念。我正在尝试模块化这个非常简单的 shinydashboard 应用程序:

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(uiOutput("box"))
)

server <- function(input, output, session) {
  output$box <- renderValueBox({
    valueBox(
      subtitle = "Hi",
      value = 2
    )
  })
}

shinyApp(ui, server)

效果如愿。

但是,在模块化时,我不断遇到以下错误: Error in shiny::NS(id) : argument "id" is missing, with no default.

#### Modules ####
costumizedValueBox <- function(id) {
  ns <- shiny::NS(id)
  uiOutput(ns("box"))
}

costumizedValueBoxServer <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {
      output$box <- renderValueBox({
        valueBox(
          subtitle = "Hi",
          value = 2
        )
      })
    }
  )
}

#### App ####
ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(costumizedValueBox())
)

server <- function(input, output, session) {
  costumizedValueBoxServer()
}

shinyApp(ui, server)

我尝试了对模块化代码的不同修改,none 其中有效,例如。 G。更改输出(到 textOutput)或一般设置。错误消息表明 NS 函数存在问题,但我无法弄清楚。

谢谢!

模块(即 costumizedValueBoxServer 和 costumizedValueBox)是具有必需参数的函数。

ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(costumizedValueBox("my_id")) # pass in an ID
)

server <- function(input, output, session) {
  costumizedValueBoxServer("my_id") # pass in the same ID
}

这就是@Limey 在评论中描述的内容:要了解详细信息,请参见此处https://shiny.rstudio.com/articles/modules.html

library(shiny)

#### Modules ####
costumizedValueBox <- function(id, label = "ValueBox_custom") {
  ns <- shiny::NS(id)
  uiOutput(ns("box"))
}

costumizedValueBoxServer <- function(id) {
  moduleServer(
    id,
    function(input, output, session) {
      output$box <- renderValueBox({
        valueBox(
          subtitle = "Hi",
          value = 2
        )
      })
    }
  )
}

#### App ####
ui <- dashboardPage(
  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(costumizedValueBox("ValueBox_custom1"))
)

server <- function(input, output, session) {
  costumizedValueBoxServer("ValueBox_custom1")
}

shinyApp(ui, server)

是的,当您调用您的模块时,请确保在引号中为它分配一个 ID。干得好,我也一直在学习这个。确保您的 ID 与应用的服务器和 UI 部分中的模块调用相匹配。 这是一个 youtube link,你可能已经看过了,但时间戳显示了我在说什么。

https://www.youtube.com/watch?v=oOYaHsPXLvs

  dashboardHeader(),
  dashboardSidebar(),
  dashboardBody(costumizedValueBox("VBox_id_1")) # pass in an ID
)

server <- function(input, output, session) {
  costumizedValueBoxServer("VBox_id_1") # pass in the same ID
}```