如何为R的equatiomatic包开发Shiny适配的renderEq()与eqOutput()函数
实现方案
你完全可以基于Shiny原生的渲染和输出逻辑封装这两个函数,不需要依赖htmlwidgets,也支持自由修改UI元素结构:
1. 自定义函数实现
# UI端输出函数,包内导出请加@export注解 eqOutput <- function(outputId, width = "100%", height = "auto") { # 可自由修改此处UI结构,添加自定义class、样式、外层容器等 shiny::uiOutput(outputId = outputId, width = width, height = height) } # 服务端渲染函数,包内导出请加@export注解 renderEq <- function(expr, env = parent.frame(), quoted = FALSE) { # 解析传入的响应式表达式 func <- shiny::installExprFunction(expr, "func", env, quoted) shiny::renderUI({ eq_res <- func() # 封装原有固定渲染逻辑 shiny::withMathJax( shiny::helpText( equatiomatic::format.equation(eq_res) # 若你已导出format.equation可去掉::: ) ) }) }
2. 简化后的调用示例
完全符合你预期的调用方式,功能和原有实现一致:
library(shiny) library(shinyWidgets) library(ggplot2) library(equatiomatic) library(gtsummary) library(gt) ui <- fluidPage( titlePanel("equatiomatic w/Shiny"), sidebarLayout( sidebarPanel( multiInput( inputId = "xvars", label = "Select predictor variables :", choices = names(mpg)[-8], selected = "displ" ) ), mainPanel( eqOutput("eq"), # 直接调用自定义UI函数 gt_output("tbl") ) ) ) server <- function(input, output) { model <- reactive({ form <- paste("hwy ~ ", paste(input$xvars, collapse = " + ")) lm(as.formula(form), mpg) }) # 按你想要的写法调用渲染函数 output$eq <- renderEq( extract_eq(model(), wrap = TRUE, terms_per_line = 3) ) output$tbl <- render_gt({ as_gt(tbl_regression(model())) }) } shinyApp(ui = ui, server = server)
调整说明
- 要修改UI元素属性、结构,直接调整
eqOutput的返回值即可,比如添加自定义CSS类、嵌套额外容器、修改默认宽高规则。 - 要调整渲染逻辑,比如更换MathJax配置、替换
helpText为其他元素、添加公式复制按钮等,直接修改renderEq内部的UI生成逻辑即可。 - 包构建时建议把
format.equation方法正式导出,避免使用:::调用内部函数引发R CMD检查警告。
内容的提问来源于stack exchange,提问作者Daniel Anderson
相关产品推荐
相关产品推荐

