使用带有shinymanager和rhino的NS模块

问题描述 投票:0回答:1

我创建了一个 rhino R Shiny 应用程序,并想添加闪亮管理器身份验证。添加shinymanager意味着我无法使用模块,因为我无法使用

ns <- NS(id)
,因为id未定义。

根据文档,添加shinymanager是通过将ui包装在shinymanager$secure_app()中来完成的:

# app/main.R
box::use(
  shiny,
  shinymanager,
)

# Define your `check_credentials` function.
# This is just an example. Do not hard-code the credentials in your actual application.
check_credentials <- shinymanager$check_credentials(
  data.frame(user = "admin", password = "admin")
)

#' @export
ui <- shinymanager$secure_app( # Wrap your entire UI in `secure_app()`.
  shiny$bootstrapPage(
    shiny$textInput("name", "Name"),
    shiny$textOutput("message")
  )
)

#' @export
server <- function(input, output) {
  # Call `secure_server()` at the beginning of your server function.
  shinymanager$secure_server(check_credentials)
  output$message <- shiny::renderText(paste0("Hello ", input$name, "!"))
}

问题是我的 .main 文件包含多个模块,如下所示:

# app/main.R

box::use(
  shiny[bootstrapPage, moduleServer, NS],
)
box::use(
  app/view/chart,
)

#' @export
ui <- function(id) {
  ns <- NS(id)

  bootstrapPage(
    chart$ui(ns("chart"))
  )
}

#' @export
server <- function(id) {
  moduleServer(id, function(input, output, session) {
    chart$server("chart")
  })
}

当 UI 包含在

chart$ui(ns("chart"))
中并且由于
shinymanager$secure_app(
未定义而导致
ns <- NS(id)
返回错误时,如何将 NS 用于像
id
这样的模块?

代码会是这样的:

# app/main.R
box::use(
  shiny,
  shinymanager,
)

# Define your `check_credentials` function.
# This is just an example. Do not hard-code the credentials in your actual application.
check_credentials <- shinymanager$check_credentials(
  data.frame(user = "admin", password = "admin")
)

#' @export
ui <- shinymanager$secure_app( # Wrap your entire UI in `secure_app()`.

  ns <- NS(id)

  shiny$bootstrapPage(
    shiny$textInput(ns("name"), "Name"),
    shiny$textOutput(ns("message")),
    chart$ui(ns("chart"))
  )
)

#' @export
server <- function(input, output, session) {
  # Call `secure_server()` at the beginning of your server function.
  shinymanager$secure_server(check_credentials)
  output$message <- shiny::renderText(paste0("Hello ", input$name, "!"))
  
  ns <- session$ns
  chart$server("chart")
}

这里是犀牛教程链接:

https://appsilon.github.io/rhino/articles/how-to/use-shinymanager.html

https://appsilon.github.io/rhino/articles/tutorial/create-your-first-rhino-app.html

也许还有另一种方法可以在不使用 NS 的情况下使用 .main 文件中的模块?我觉得应该有一个我没有想到的简单解决方案。

r shiny shinymodules shinymanager
1个回答
0
投票

问题解决了吗?我正在使用 rhino 构建和应用程序,将来我需要实现闪亮管理器。

© www.soinside.com 2019 - 2024. All rights reserved.