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

使用Rhino包在R中调用JS函数无法关闭Fluent面板求助

问题原因与解决方法

问题出在Panel组件的onDismiss回调逻辑里:你直接在JS字符串中使用了R端的ns('hidePanel')函数,但这段JS代码运行在浏览器端,无法识别R的命名空间函数,导致Shiny.setInputValue传递的输入ID不正确,server端的observeEvent(input$hidePanel)无法触发。

修正步骤

修改app/view/panel.R中的server部分,先在R端生成带命名空间的正确ID,再注入到JS代码中:

#' @export
server <- function(id) {
  moduleServer(id, function(input, output, session){
    isPanelOpen <- reactiveVal(FALSE)
    # 生成带命名空间的hidePanel输入ID
    hidePanelId <- session$ns("hidePanel")
    
    output$reactPanel <- renderReact({
      Panel(
        headerText = "Sample panel",
        isOpen = isPanelOpen(),
        "Content goes here.",
        # 将R端生成的ID注入到JS回调中
        onDismiss = JS(sprintf("function() { Shiny.setInputValue('%s', Math.random()); }", hidePanelId))
      )
    })
    observeEvent(input$showPanel, isPanelOpen(TRUE))
    observeEvent(input$hidePanel, isPanelOpen(FALSE))
  })
}

原理说明

Rhino采用模块嵌套结构,每个模块有独立的命名空间,输入ID必须包含正确的命名空间前缀才能被对应模块的server端识别。通过session$ns()在R端生成合法的ID,再注入到JS代码中,就能让浏览器端触发的事件被server端正确监听。

内容的提问来源于stack exchange,提问作者Alyssa Allsop

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 06:40:19