0

我有一个关于如何为 ODE 模型拟合参数的 R 脚本。它在 R 中运行良好。以下是我在 R 中的代码:

library(ggplot2) 
library(reshape2) 
library(deSolve) 
library(minpack.lm) 

#load concentration data
df=read.table("Test.txt")
names(df)=c("time","ca","cb","cc")

# prediction of concentration
# rate function
rxnrate=function(t,c,parms){

 k1=parms$k1
 k2=parms$k2

 r=rep(0,length(c))
 r[1]=-k1*c["A"]  #dcA/dt
 r[2]=k1*c["A"]-k2*c["B"]     

 return(list(r))

}

# function that calculates residual sum of squares
ssq=function(parms){

  # inital concentration 
    cinit=c(1,2)


  # time points for which conc is reported
  # include the points where data is available
  t=c(seq(0,5,0.1),df$time)
  t=sort(unique(t))

  # parms from the parameter estimation routine
  k1=parms[1]
  k2=parms[2]


  # solve ODE for a given set of parameters
  out=ode(y=cinit,times=t,func=rxnrate,parms=list(k1=k1,k2=k2))

  # Filter data that contains time points where data is available
  outdf=data.frame(out)
  outdf=outdf[outdf$time %in% df$time,]
  # Evaluate predicted vs experimental residual
  preddf=melt(outdf,id.var="time",variable.name="species",value.name="conc")
  expdf=melt(df,id.var="time",variable.name="species",value.name="conc")
  ssqres=preddf$conc-expdf$conc

  # return predicted vs experimental residual
  return(ssqres)
  }

# parameter fitting using levenberg marquart algorithm
# initial guess for parameters
  parms=c(k1=0.5,k2=0.5)

# fitting
fitval=nls.lm(par=parms,fn=ssq)

# Summary of fit
summary(fitval)

# Estimated parameter
parest=as.list(coef(fitval))

# mean error
ms=sqrt(deviance(fitval)/dof)
ms

当前阶段,我需要从 C# 访问结果(例如 parest 和 ms)。我可以生成 R 和 C# 之间的连接。但是,我不知道如何使用 C# 代码来获取这些值。

static void Main(string[] args)
        {

            REngine.SetEnvironmentVariables(); 
            REngine engine = REngine.GetInstance();
            engine.Evaluate("source('myScript path')");

        }

在此之后,我需要使用什么来要求结果?

谢谢洪

4

1 回答 1

1

您需要engine.getsymbol在 C# 代码中使用以从 R.script 访问结果。例如:

   var ResultsinC = engine.GetSymbol("R.list").AsNumeric().ToList();
   var X = engine.GetSymbol("R.matrix").AsNumericMatrix();

希望有帮助。

于 2016-11-17T16:15:00.710 回答