2016-09-08 8 views
0

から読み取るにはODEモデルのパラメータをフィッティングする方法については、Rスクリプトがあります。Rスクリプトの結果をC#

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である以下R.ザにうまく機能します。私はRとC#の間の接続を生成することができます。しかし、私はこれらの価値を取るためにC#コードを使用する方法については考えていません。

static void Main(string[] args) 
     { 

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

     } 

この後、結果を要求するために何を使用する必要がありますか?

おかげ香港

答えて

1

あなたはR.scriptからの結果にアクセスするためのC#コードでengine.getsymbolを使用する必要があります。例:

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

関連する問題