2016-09-08 2 views
0

У меня есть скрипт R о том, как установить параметры для моделей 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 

Нынешний этапу, мне нужно получить доступ к результатам (например, как parest и мс) из C#. Я могу создать соединение между R и C#. Однако я понятия не имею, как использовать код C# для принятия этих значений.

static void Main(string[] args) 
     { 

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

     } 

После этого, что мне нужно использовать для запроса результата?

Спасибо Hong

ответ

1

Вы должны использовать engine.getsymbol в C# код для доступа к результатам из R.script. Например:

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

Надеюсь, что это поможет.