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

本文介绍了如何在Visual Studio 2005中使用R(D)COM进行统计回归分析,包括下载R软件、安装配置R(D)COM组件、在VS2005中添加引用等步骤,并提供了一个抽象基类BaseRegression的实现示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在[url]http://cran.r-project.org/[/url]可以下载R软件,选择Other,下载R_Scilab_DCOM3.0-1B5.exe,就是R(D)COM。
在安装了R(D)COM之后,假设安装目录为“D:\Program Files\(D)COM Server\bin“。在该目录下有RServerManager.exe,在VS2005中通过Add Reference->Browse,选择RServerManager.exe。添加以后,会增加RServerManager, ConnectorCommonLib,
STATCONNECTORSEVLib三个引用。可以通过VS2005的对象察看器看三个引用中的类和函数。
每次创建一个StatConnectorClass对象时,都会启动一个服务,用于处理一个连接对象所提交的请求,这个资源不会自己停止,所以需要一个类似于连接池的服务管理器。在R(D)COM中提供了两个类ServerPool和ServerItem来完成服务管理的功能。下面的类封装了该操作。


using System;
using STATCONNECTORSRVLib;
using RServerManager;
using System.Threading;

namespace Common.Regression
{
/** <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()
{
}
}

}


从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();


}

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值