使用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
相关产品推荐
相关产品推荐

