C#调用R软件:R(D)COM

转载 2013年12月03日 09:29:05

在C#中怎样调用R软件呢。R软件不只是一种统计工具,它还是一种语言,就语法形式而言跟S语言非常相识。所以类似与数据库一样,在客户端不是就只能调用一些函数,而是可以用数据库提供的SQL语言编写出拥有灵活多变,满足各种需求的功能。R语言也一样,可以在客户端,用S语言编写程序,传送到R软件,R软件计算完成后将结果在传回C#

。既然需要来回传送,必然需要中间的桥梁,就像数据库需要驱动程序一样,在C#中调用R软件,需要安装R(D)COM,R(D)COM是一种DCOM组件,可以注册到Windows的组件服务中,供程序调用。如果用C#开发Web程序,由于ASP.NET是用ASPNET这个用户在执行,而这个用户的权限很低,所以如果要调用R(D)COM的服务的化,需要给ASPNET授予权限。

所有具体的操作,使用方法,可以参考:

http://www.codeproject.com/KB/cs/RtoCSharp.aspx


----------------------------------------------------------------------------------------------------------------------------

1using System;


 2using System.Configuration;




 5namespace Common.Regression


 6{
   /**//// <summary>
   /// IRegression 回归类接口
   /// </summary>
   public interface IRegression
   {
       double[,] Data
       {
           get;
           set;
       }


       RegressionSummary Summary
       {
           get;
       }


       void DoRegression();


       void ReleaseLock();




   }


}



-------------------------------------------------------------------------

1using System;


  2using STATCONNECTORSRVLib;


  3using RServerManager;


  4using System.Threading;


  6namespace Common.Regression


  7{
   /**//// <summary>
   /// BaseRegression 回归抽象基类
   /// </summary>
   public abstract class BaseRegression : IRegression
   {
       private static ServerPool mServerPool = null;
       private ServerItem mServerItem = null;
       private IStatConnector mStatConnector = null;


       private static string mKey = "R";
       private static string mClient = "this is client";
       private static int mWaitTime = 50;
       private static int mMaxLoop = 20;
       private static int mMaxServerCount = 5;
       private static int mServerCount = 0;


       static BaseRegression()
       {
           if (mServerPool == null)
           {
               mServerPool = new ServerPool();
           }
       }


       private double[,] mData;
       public double[,] Data
       {
           get
           {
               return mData;
           }
           set
           {
               mData = value;
           }
       }


       private RegressionSummary mSummary;
       public RegressionSummary Summary
       {
           get
           {
               return mSummary;
           }
           set
           {
               mSummary = value;
           }
       }


       /**//// <summary>
       /// 执行回归函数
       /// </summary>
       public abstract void DoRegression();


       /**//// <summary>
       /// 得到执行R代码的连接
       /// </summary>
       /// <returns></returns>
       protected IStatConnector GetStatConnector()
       {
           mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
           int count = 0;
           while (mServerItem == null)
           {
               if (mServerCount < mMaxServerCount)
               {
                   //当小于最小服务器数目时,增加连接
                   mStatConnector = new StatConnectorClass();
                   mStatConnector.Init(mKey);
                   mServerPool.Add(mStatConnector, mKey);
                   mServerCount++;
                   mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
                   break;
               }
               if (count < mMaxLoop)
               {
                   Thread.Sleep(mWaitTime);
                   count++;
                   mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
               }
               else
               {
                   return null;
               }
           }


           mStatConnector = mServerItem.Server;
           return mStatConnector;
          
       }


       /**//// <summary>
       /// 释放锁定
       /// </summary>
       public void ReleaseLock()
       {
           if (mServerItem != null)
           {
               mServerItem.ReleaseLock();
           }
       }


       public BaseRegression()
       {           
       }
   }


}

----------------------------------------------------------------------------------------

1using System;


 2using System.Data;


 3using System.Configuration;


 4using STATCONNECTORSRVLib;


 6namespace Common.Regression


 7{
   /**//// <summary>
   /// LogicRegression 利用Logistic模型进行回归
   /// </summary>
   public class LogisticRegression : BaseRegression
   {
       private IStatConnector mStatConnector;
       public LogisticRegression()
       {
           mStatConnector = GetStatConnector();
       }


       public override void DoRegression()
       {
           if (Data == null)
           {
               return;
           }
         
           mStatConnector.SetSymbol("dd", Data);
           mStatConnector.EvaluateNoReturn("Y <- dd[,1]");
           mStatConnector.EvaluateNoReturn("X <- dd[,-1]");


           mStatConnector.EvaluateNoReturn("gr<-glm(Y~X , family=binomial(logit))");
           mStatConnector.EvaluateNoReturn("ss<-summary(gr)");


           Summary = new RegressionSummary(mStatConnector);
           
       }
   }


}


  在http://cran.r-project.org/可以下载R软件,选择Other,下载R_Scilab_DCOM3.0-1B5.exe,就是R(D)COM。
      
在安装了R(D)COM之后,假设安装目录为“D:\Program Files\(D)COM Server\bin“。在该目录下有RServerManager.exe,在VS2008/2010中通过Add Reference->Browse,选择RServerManager.exe。添加以后,会增加RServerManager, ConnectorCommonLib,

STATCONNECTORSEVLib三个引用。可以通过VS2008的对象察看器看三个引用中的类和函数。
      每次创建一个StatConnectorClass对象时,都会启动一个服务,用于处理一个连接对象所提交的请求,这个资源不会自己停止,所以需要一个类似于连接池的服务管理器。在R(D)COM中提供了两个类ServerPool和ServerItem来完成服务管理的功能。下面的类封装了该操作。
1using System;
  2using STATCONNECTORSRVLib;
  3using RServerManager;
  4using System.Threading;
  6namespace Common.Regression
  7{
   /**//// <summary>
   /// BaseRegression 回归抽象基类
   /// </summary>
   public abstract class BaseRegression : IRegression
   {
       private static ServerPool mServerPool = null;
       private ServerItem mServerItem = null;
       private IStatConnector mStatConnector = null;
 17        private static string mKey = "R";
       private static string mClient = "this is client";
       private static int mWaitTime = 50;
       private static int mMaxLoop = 20;
       private static int mMaxServerCount = 5;
       private static int mServerCount = 0;
 24        static BaseRegression()
       {
           if (mServerPool == null)
           {
               mServerPool = new ServerPool();
           }
       }
 32        private double[,] mData;
       public double[,] Data
       {
           get
           {
               return mData;
           }
           set
           {
               mData = value;
           }
       }
 45        private RegressionSummary mSummary;
       public RegressionSummary Summary
       {
           get
           {
               return mSummary;
           }
           set
           {
               mSummary = value;
           }
       }
 58        /**//// <summary>
       /// 执行回归函数
       /// </summary>
       public abstract void DoRegression();
 63        /**//// <summary>
       /// 得到执行R代码的连接
       /// </summary>
       /// <returns></returns>
       protected IStatConnector GetStatConnector()
       {
           mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
           int count = 0;
           while (mServerItem == null)
           {
               if (mServerCount < mMaxServerCount)
               {
                   //当小于最小服务器数目时,增加连接
                   mStatConnector = new StatConnectorClass();
                   mStatConnector.Init(mKey);
                   mServerPool.Add(mStatConnector, mKey);
                   mServerCount++;
                   mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
                   break;
               }
               if (count < mMaxLoop)
               {
                   Thread.Sleep(mWaitTime);
                   count++;
                   mServerItem = mServerPool.GetServerExclusive(mKey, mClient);
               }
               else
               {
                   return null;
               }
           }
 95            mStatConnector = mServerItem.Server;
           return mStatConnector;
          
       }
100        /**//// <summary>
       /// 释放锁定
       /// </summary>
       public void ReleaseLock()
       {
           if (mServerItem != null)
           {
               mServerItem.ReleaseLock();
           }
       }
       public BaseRegression()
       {           
       }
   }
}


从BaseRegression继承的类将拥有可以被管理。

using System;
  using System.Configuration;
  
  
  namespace Common.Regression
  {
      /// <summary>
      /// IRegression 回归类接口
    /// </summary>
     public interface IRegression
     {
         double[,] Data
         {
            get;
             set;
        }
 
         RegressionSummary Summary
         {
             get;
         }
 
        void DoRegression();
 
         void ReleaseLock();


    }
 
 }

C#编写自定义特性(Attribute)详解(转自:http://www.csharpwin.com/csharpspace/9349r9836.shtml)

 摘要:本文介绍C#编写自定义特性(Attribute),自定义属性本质上是直接或间接地从 System.Attribute 派生的传统类。与传统类一样,自定义属性也包含存储和检索数据的方法。要设计自...
  • lslxdx
  • lslxdx
  • 2011年04月02日 14:10
  • 830

创建C#串口通信程序详解(转自:http://www.csharpwin.com/csharpspace/5544r7857.shtml)

在.NET平台下创建C#串口通信程序,.NET 2.0提供了串口通信的功能,其命名空间是System.IO.Ports。这个新的框架不但可以访问计算机上的串口,还可以和串口设备进行通信。我们将使用标准...
  • lslxdx
  • lslxdx
  • 2011年04月28日 14:49
  • 3215

Zbrush4r7|3D建模雕刻软件

Zbrush的3D建模在游戏设计、影视方面有卓越的体现,特别是在雕刻方面,是一款专业性较强的行业软件。...

(方法二)Excel是最常用的办公软件。每个单元格都有唯一的地址表示 比如:第4列表示为:“D”,第255列表示为“IU”。 事实上,Excel提供了两种地址表示方法,还有一种表示法叫做R

package Java2012大赛; /* Excel是最常用的办公软件。每个单元格都有唯一的地址表示。 比如:第4列表示为:“D”,第255列表示为“IU”。 事实上,Exce...
  • CTLLIN
  • CTLLIN
  • 2013年04月14日 12:18
  • 2191

软件外包词汇解释——ITO, BPO, KPO, R&D

ITO (Information Technology Outsourcing) 信息技术外包 BPO (Business Process Outsourcing) 业务流程外包 KPO (Kno...
  • lj89168
  • lj89168
  • 2011年09月04日 18:11
  • 2846

用C#调用R语言开发.NET MVC Web服务

R语言是个解释执行的语言,语法风格对于常年写C#的我来说非常怪异。并且R的web包shiny用起来也不是很顺手,所以如果要把R的功能用作生产,我倾向于用高级语言给他做一次封装,这样无论是可扩展性还是性...

vs2012 C# 调用 matlab R2014b 编译的dll

首先确定matlab R2014b是完美破解的, 否则不能用mcc 完美破解补丁在这个网站 http://bbs.pcbeta.com/forum.php?mod=viewthread&tid=155...

一种C#调用R的方法

  • 2014年11月22日 19:59
  • 16KB
  • 下载

C#通过批处理来调用Matlab和R语言 为什么格式会乱七八糟???

一,批处理Matlab语言 Step1.编写temp.m例子程序在D盘根目录下,功能将传入的参数写到D:\\Data.txt文件里 function A=temp(n, m) fid=fopen('...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C#调用R软件:R(D)COM
举报原因:
原因补充:

(最多只允许输入30个字)