You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

动态构建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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 13:39:50