我创建了一个 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 文件中的模块?我觉得应该有一个我没有想到的简单解决方案。
问题解决了吗?我正在使用 rhino 构建和应用程序,将来我需要实现闪亮管理器。