如何在R Shiny Golem包中让conditionalPanel适配启动传入的参数
问题根源
你写的代码不生效有两个核心原因:
conditionalPanel的condition参数接收的是客户端JavaScript代码,不是R语法,你写的!is.null(r.input)里的is.null()是R函数,在浏览器环境中不存在,判断逻辑不会按预期运行。- 服务端定义的
reactiveValues对象r默认不会同步到前端JS环境,JS侧找不到r.input这个变量,此时判断逻辑返回的结果恒为真,所以面板一直显示。
解决方案
你的需求是根据启动时传入的固定参数判断显示逻辑,不需要后续动态修改,推荐用最简单的方案1即可:
方案1:UI层直接用R逻辑判断(推荐)
启动参数在应用初始化时就已经确定,不需要借助条件面板的前端判断逻辑,直接在UI生成时用R代码判断是否渲染对应元素即可,修改app_ui.R:
#' The application User-Interface #' #' @param request Internal parameter for `{shiny}`. #' DO NOT REMOVE. #' @import shiny #' @noRd app_ui <- function(request) { # 初始化时直接读取启动传入的参数 start_input <- golem::get_golem_options("input") tagList( # Leave this function for adding external resources golem_add_external_resources(), # List the first level UI elements here fluidPage( h1("testapp"), # 直接用R逻辑判断是否渲染段落 if (!is.null(start_input)) { p('there is an input ') } ) ) }
不需要修改服务端和启动函数的代码,即可实现效果:传入非空input参数时显示对应文本,传入NULL时不显示。
方案2:适配conditionalPanel逻辑(适合后续参数会动态修改的场景)
如果你后续需要在应用运行过程中动态修改这个显示条件,需要把判断逻辑同步到前端,按如下修改:
- 修改
app_server.R,把判断结果暴露给前端可识别的output变量:
#' The application server-side #' #' @param input,output,session Internal parameters for {shiny}. #' DO NOT REMOVE. #' @import shiny #' @noRd app_server <- function( input, output, session ) { # List the first level callModules here r <- reactiveValues(input = golem::get_golem_options("input")) # 把判断结果暴露给output output$input_non_null <- reactive({ !is.null(r$input) }) # 关闭隐藏时暂停更新的设置,保证值能正常传到前端 outputOptions(output, "input_non_null", suspendWhenHidden = FALSE) }
- 修改
app_ui.R里的conditionalPanel配置,用JS可识别的output变量做判断:
conditionalPanel( condition = "output.input_non_null", p('there is an input ') )
内容的提问来源于stack exchange,提问作者tycheo
相关产品推荐
相关产品推荐

