如何在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的调用规则有差异,需要写一个包装函数适配两者的交互逻辑。
创建名为
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); }将你的
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
相关产品推荐
相关产品推荐

