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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 22:45:01