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

如何在R中调用Matlab Coder编译的C函数并用于Shiny应用?

在R中调用Matlab Coder编译的C函数并整合到Shiny应用

一、准备工作

  • 确保电脑安装对应系统的C编译器:Windows用户安装Rtools,macOS安装Xcode命令行工具,Linux安装gcc/g++。可在R中运行Sys.which("gcc")检查是否能识别编译器。
  • 安装并加载Rcpp包(简化R与C交互的工具):
    install.packages("Rcpp")
    library(Rcpp)
    

二、编写Rcpp包装函数

由于R和C的调用规则有差异,需要写一个包装函数适配两者的交互逻辑。

  1. 创建名为wrapper.cpp的文件,内容如下:

    #include <Rcpp.h>
    // 声明你的C函数(如果Matlab Coder生成了对应.h文件,替换成#include "ensembleBaggedTreesExtendedStay_V1.h"即可)
    double ensembleBaggedTreesExtendedStay_V1(double TransferredYesNo,
                                             double BleedDisYesNo,
                                             double PreOpAlbumin, double PreOpHCT,
                                             double ASAClass, double ComplexYesNo);
    
    // 标记该函数可被R调用
    // [[Rcpp::export]]
    Rcpp::NumericVector predict_stay(double TransferredYesNo,
                                     double BleedDisYesNo,
                                     double PreOpAlbumin,
                                     double PreOpHCT,
                                     double ASAClass,
                                     double ComplexYesNo) {
      // 调用目标C函数
      double result = ensembleBaggedTreesExtendedStay_V1(TransferredYesNo, BleedDisYesNo,
                                                        PreOpAlbumin, PreOpHCT,
                                                        ASAClass, ComplexYesNo);
      // 将C的double类型结果转为R可识别的向量格式
      return Rcpp::NumericVector::create(result);
    }
    
  2. 将你的ensembleBaggedTreesExtendedStay_V1.c和wrapper.cpp放在同一文件夹(比如你的R项目根目录)。

三、编译并加载函数到R

在R中运行以下代码,完成编译并加载包装函数:

# 编译C源文件和Rcpp包装器
Rcpp::sourceCpp(files = c("ensembleBaggedTreesExtendedStay_V1.c", "wrapper.cpp"))

编译成功后,可直接在R中测试调用:

# 传入测试参数验证
predict_stay(1.0, 0.0, 3.5, 40.0, 2.0, 1.0)

四、整合到Shiny应用

将编译好的函数嵌入Shiny的服务器逻辑中,即可实现网页端的交互调用。示例代码如下:

library(shiny)
library(Rcpp)

# 提前编译加载函数(确保文件路径正确)
Rcpp::sourceCpp(files = c("ensembleBaggedTreesExtendedStay_V1.c", "wrapper.cpp"))

ui <- fluidPage(
  titlePanel("术后住院时长预测"),
  sidebarLayout(
    sidebarPanel(
      numericInput("transferred", "是否转诊(1=是,0=否)", value = 0),
      numericInput("bleed", "是否有出血性疾病(1=是,0=否)", value = 0),
      numericInput("albumin", "术前白蛋白", value = 3.5),
      numericInput("hct", "术前红细胞压积", value = 40.0),
      numericInput("asa", "ASA分级", value = 2.0),
      numericInput("complex", "手术是否复杂(1=是,0=否)", value = 0),
      actionButton("predict_btn", "开始预测")
    ),
    mainPanel(
      h3("预测结果"),
      textOutput("pred_result")
    )
  )
)

server <- function(input, output) {
  observeEvent(input$predict_btn, {
    # 调用编译好的预测函数
    pred_result <- predict_stay(
      input$transferred,
      input$bleed,
      input$albumin,
      input$hct,
      input$asa,
      input$complex
    )
    # 渲染输出结果
    output$pred_result <- renderText({
      paste("预测术后住院时长概率:", round(pred_result[1], 4))
    })
  })
}

shinyApp(ui = ui, server = server)

五、注意事项

  • 如果Matlab Coder生成了额外的依赖库(如.a或.dll文件),需将其与源文件放在同一目录,确保编译时能被识别。
  • 所有输入参数均为double类型,Shiny中需用numericInput组件,避免整数输入导致类型不匹配。
  • 打包Shiny应用时,需将.c和.cpp文件一同打包;若要避免用户自行编译,可提前用devtools::install()将代码编译为二进制R包。

内容的提问来源于stack exchange,提问作者Brandon Hoglund

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 17:07:49