Ответ 1
Хорошо, я решил это наконец. Проблема в том, что R (D) Com не работает с текущей версией R. Я установил 2.11.1, и это сработало из коробки.
Большое спасибо.
Мне нужно связать R с некоторым приложением С#. Я установил rscproxy_1.3
и R_Scilab_DCOM3.0-1B5
добавленные ссылки COM на STATCONNECTORCLNTLib
, StatConnectorCommonLib
и STATCONNECTORSRVLib
, но я все еще не могу заставить его работать.
Когда я запускаю следующую тестовую программу:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
//COM references
using STATCONNECTORCLNTLib;
using StatConnectorCommonLib;
using STATCONNECTORSRVLib;
namespace R_TESTING
{
class Program
{
static void Main(string[] args)
{
StatConnector sc1 = new STATCONNECTORSRVLib.StatConnectorClass();
sc1.Init("R");
}
}
}
Я получаю это исключение:
Unhandled Exception: System.Runtime.InteropServices.COMException: Exception from HRESULT: 0x80040013
at STATCONNECTORSRVLib.StatConnectorClass.Init(String bstrConnectorName)
Спасибо заранее.
UPDATE: Хорошо, до сих пор не повезло. Я попытаюсь объяснить, что я сделал до сих пор.
Установлен R-2.12.2-win.exe из rproject для
C:\Program Files\R\R-2.12.2
Скачан rscproxy_1.3-1.zip и скопируйте/вставьте его в
C:\Program Files\R\R-2.12.2\library
Установлен R_Scilab_DCOM3.0-1B5.exe для
C:\Program Files (x86)\R\(D)COM Server
С Scilab появляется базовый тест. Я попытался запустить его, но я получил следующую ошибку:
Загрузка сервера StatConnector... Готово Инициализация R... Ошибка вызова функции Код: -2147221485 Текст: установка проблема: не удается загрузить разъем Освобождение сервера StatConnector... Выполнено
Чем я смотрел в PATH/System Variables и не нашел никакой информации о пути /R _HOME/R_USER. Кроме того, я не мог найти что-либо, связанное с R в реестре.
Я думаю, я делаю что-то ужасно неправильно, поэтому мне отчаянно нужна помощь от вас, ребята.
Хорошо, я решил это наконец. Проблема в том, что R (D) Com не работает с текущей версией R. Я установил 2.11.1, и это сработало из коробки.
Большое спасибо.
Вы можете посмотреть R.NET, для другого подхода...
Используйте R.NET (я установил мой из NuGet) и следующий код в новом консольном приложении С# (который был скопирован с небольшими изменениями от http://rdotnet.codeplex.com/).
Он будет работать, если указывать на 32-разрядную версию R v2.11.1, но он не будет работать, если указывать на 64-битную версию R v2.11.1 (как указано в приведенном ниже коде).
Когда я установил NuGet, он автоматически добавил ссылки на текущий проект: RDotNet
(RDotNet.dll) и RDotNet.NativeLIbrary
(RDotNet.NativeLibrary.dll). Эти ссылки вам понадобятся в любом новом проекте.
Работает под VS2012 (не протестировано под VS2010, но, вероятно, будет работать).
Работает при компиляции как для "x32", так и "All CPU" (в разделе "Build..Configuration Manager" в VS2012).
// Call R from .NET. Advantage is that everything is in process.
// Tested on VS2012, will probably work on VS2010.
using System;
using System.IO;
using System.Linq;
using RDotNet;
class Program
{
static void Main(string[] args)
{
// Set the folder in which R.dll locates.
var envPath = Environment.GetEnvironmentVariable("PATH");
var rBinPath = @"C:\Program Files (x86)\R\R-2.11.1\bin";
//var rBinPath = @"C:\Program Files\R\R-2.11.1-x64\bin"; // Doesn't work ("DLL was not found.")
Environment.SetEnvironmentVariable("PATH", envPath + Path.PathSeparator + rBinPath);
using (REngine engine = REngine.CreateInstance("RDotNet"))
{
// Initializes settings.
engine.Initialize();
// .NET Framework array to R vector.
NumericVector group1 = engine.CreateNumericVector(new double[] { 30.02, 29.99, 30.11, 29.97, 30.01, 29.99 });
engine.SetSymbol("group1", group1);
// Direct parsing from R script.
NumericVector group2 = engine.Evaluate("group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)").AsNumeric();
// Test difference of mean and get the P-value.
GenericVector testResult = engine.Evaluate("t.test(group1, group2)").AsList();
double p = testResult["p.value"].AsNumeric().First();
Console.WriteLine("Group1: [{0}]", string.Join(", ", group1));
Console.WriteLine("Group2: [{0}]", string.Join(", ", group2));
Console.WriteLine("P-value = {0:0.000}", p);
}
}
}
Из здесь:
Думаю, я просто вспомнил, как решить исключение 80040013. Я думаю, это связано с тем, что мой установка R файлов не включала rscproxy.dll. Где-то по пути, R изменилось с использования dll (я думаю) proxy.dll и начал использовать один из них, называемый rscproxy.dll. Вы должны найти и скачать rscproxy.dll в папку R\bin.
Если это не сработает, проверьте переменные среды, чтобы убедиться, что значения R_HOME и R_USER указывая на папку R\bin. Убедитесь, что объекты R (D) Com правильно зарегистрированы в Windows.
Проблема:
Загрузка сервера StatConnector... Выполнение инициализации R... Вызов функции failed Код: -2147221485 Текст: проблема с установкой: невозможно загрузить Разъем Освобождение сервера StatConnector... Готово
Решение: [Кстати, у меня R, RStudio, Revolution R на моем ПК]
1. Установите необходимые программы и пакеты:
Для выполнения экспоненциального сглаживания в Eviews (7.2) необходимы дополнения ExpSmooth.
Для правильной работы надстройками ExpSmooth необходимо установить программу R, прогноз пакетов и rscproxy; и statconnDCOM должен быть установлен.
2. Поместите файлы и папки в правильные места BIN и LIBRARY:
Скопируйте-вставьте файл rscproxy.dll в папки C:\Program Files\R\R-2.15.3\bin
и C:\Revolution\R-Enterprise-6.1\R-2.14.2\bin
.
Поместите папку rscproxy в файл rscproxy_2.0-5.zip в папки C:\Revolution\R-Enterprise-6.1\R-2.14.2\library
и C:\Program Files\R\R-2.15.3\library
.
3. Дополнительная информация:
Я не вносил никаких изменений в переменные окружения, чтобы преодолеть эту проблему.
Я установил некоторые переменные окружения в первый раз, когда я установил R и Revolution R, как это (этот параметр является неослабевающим с контекстом здесь):
Системные переменные - Путь:
C:\Rtools\bin; C:\Program Files\R\R-3.0.2\bin\i386; C:\Rtools\gcc-4.6.3\bin;
(Я предлагаю вам установить версию R, которую вы установили и используете).
Запустите Server 01 – Basic Test
, который существовал при установке statconnDCOM: Start - statconn - DCOM - "Сервер 01 - базовый тест".
Нажмите на R.
statconnDCOM работал.
Вот как вызвать пользовательскую функцию R из файла Rdata (а не только встроенную функцию R). На самом деле это то, что сработало для меня. Чтобы заставить StatConnectorClass работать, мне пришлось открыть свойства для StatConnectorsRVLib и установить "Вставить типы Interop" в False.
using StatConnectorCommonLib;
using STATCONNECTORSRVLib;
using STATCONNECTORCLNTLib;
StatConnectorClass rConn = new StatConnectorClass();
try
{
rConn.Init("R"); // here is where we initialize R
Response.Write("Initialized." + "<br />"); Response.Flush();
Response.Write("1" + "<br />"); Response.Flush();
string path = @"C:SOMEPATH\Black-Scholes.RData";
rConn.SetSymbol("path", path);
Response.Write("2" + "<br />"); Response.Flush();
rConn.Evaluate("load(path)");
Response.Write("3" + "<br />"); Response.Flush();
Int16 entry = 27;
rConn.SetSymbol("n1", entry);
Response.Write("6" + "<br />"); Response.Flush();
rConn.Evaluate("x1<-samplefn(n1)" );
Response.Write("Entered : " + entry.ToString() + "<br/> ");
Object o = rConn.GetSymbol("x1");
Response.Write("Ans:" + o.ToString() + "<br />"); Response.Flush();
rConn.Close();
}
catch (Exception ex)
{
Response.Write("Error: " + ex.Message );//+ " xx " + rConn.GetErrorText());
rConn.Close();
}
Надеюсь, это поможет!