动态构建Shiny UI时ShinyFriendlyCaptcha组件无法显示的问题
问题:Shiny动态UI中ShinyFriendlyCaptcha验证码不显示
我在Shiny应用中使用ShinyFriendlyCaptcha包实现验证码功能,静态UI的最小可复现示例能正常显示验证码,但改用uiOutput+renderUI动态构建UI后,验证码完全不显示,控制台出现以下jsonlite相关警告:
Input to asJSON(keep_vec_names=TRUE) is a named vector. In a future version of jsonlite, this option will not be supported, and named vectors will be translated into arrays instead of objects. If you want JSON object output, please use a named list instead. See ?toJSON.
静态正常代码
library(shiny) library(ShinyFriendlyCaptcha)#devtools::install_github("mhanf/ShinyFriendlyCaptcha") ui <- fluidPage( sfc_output( id = "test", sitekey = 'FCMLPPDE8H8IO645', lang = "en", dark_mode = FALSE, eu_endpoint = FALSE, theme_bs5 = TRUE ) ) server <- function(input, output) { captcha_result <- sfc_server( id = "test", secret = 'A1T24PTUO6EU091S3HVJC3FRN5UE3JPBQ6UDO3RI3R5NM3VE4J6AQ0A8HC', sitekey = 'FCMLPPDE8H8IO645', eu_endpoint = FALSE ) } shinyApp(ui = ui, server = server)
动态有问题的代码
library(shiny) library(ShinyFriendlyCaptcha)#devtools::install_github("mhanf/ShinyFriendlyCaptcha") ui <- uiOutput("body") server <- function(input, output) { captcha_result <- sfc_server( id = "test", secret = 'A1T24PTUO6EU091S3HVJC3FRN5UE3JPBQ6UDO3RI3R5NM3VE4J6AQ0A8HC', sitekey = 'FCMLPPDE8H8IO645', eu_endpoint = FALSE ) output$body <- renderUI({ fluidPage( sfc_output( id = "test", sitekey = 'FCMLPPDE8H8IO645', lang = "en", dark_mode = FALSE, eu_endpoint = FALSE, theme_bs5 = TRUE ) ) }) } shinyApp(ui = ui, server = server)
解决方案
问题根源是动态UI渲染时,sfc_server的初始化时机早于验证码组件的创建,导致组件与服务器逻辑无法正确绑定,同时验证码的前端初始化脚本未被触发。
修复代码
将sfc_server的调用移至renderUI内部,确保组件创建完成后再绑定服务器逻辑:
library(shiny) library(ShinyFriendlyCaptcha)#devtools::install_github("mhanf/ShinyFriendlyCaptcha") ui <- uiOutput("body") server <- function(input, output) { output$body <- renderUI({ # 先创建UI组件 ui_element <- fluidPage( sfc_output( id = "test", sitekey = 'FCMLPPDE8H8IO645', lang = "en", dark_mode = FALSE, eu_endpoint = FALSE, theme_bs5 = TRUE ) ) # 绑定服务器逻辑,使用<<-将结果暴露到外部环境(如果需要后续使用) captcha_result <<- sfc_server( id = "test", secret = 'A1T24PTUO6EU091S3HVJC3FRN5UE3JPBQ6UDO3RI3R5NM3VE4J6AQ0A8HC', sitekey = 'FCMLPPDE8H8IO645', eu_endpoint = FALSE ) return(ui_element) }) } shinyApp(ui = ui, server = server)
补充说明
- 控制台的jsonlite警告是
ShinyFriendlyCaptcha包内部的代码问题,暂时不影响功能,可以忽略,建议关注包的后续更新修复该警告。 - 如果需要在
renderUI外部使用captcha_result,需用<<-赋值到全局环境(或更高层级的环境),否则变量仅在renderUI内部有效。
内容的提问来源于stack exchange,提问作者Lev
相关产品推荐
相关产品推荐

