Я C# и начинающий R пытается запустить пример http://mockquant.blogspot.com/2011/07/yet-another-way-to-use-r-in-excel-for.htmlКак получить ExcelDNA работу с R.Net
<DnaLibrary RuntimeVersion="v4.0" Name="My First XLL" Language="CS">
<ExternalLibrary Path="R.NET.dll" />
<Reference Name="R.NET" />
<![CDATA[using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExcelDna.Integration;
using RDotNet;
namespace CSLib
{
public class CSLib
{
static REngine rengine = null;
static CSLib()
{
// Set the folder in which R.dll locates.
REngine.SetDllDirectory(@"C:\Program Files\R\R-2.13.0\bin\i386");
rengine = REngine.CreateInstance("RDotNet", new[] { "-q" });
}
[ExcelFunction(Description = "get random numbers obey to normal distribution")]
public static double [] MyRnorm(int number)
{
return (rengine.EagerEvaluate("rnorm(" + number + ")").AsNumeric().ToArray<double>());
}
}
}
Я обновил ссылку в строке SetDllDirectory и я попытался как 32-битные и 64-битные версии из R (моя система процессора - win7/64 бит)
Я пробовал с более ранними стабильными версиями RDotNet и искал обновления для кода примера, например. здесь:
https://groups.google.com/d/msg/exceldna/7_wr8pwuCZ0/GLKlVFjr6l8J
<DnaLibrary RuntimeVersion="v4.0" Name="My First XLL" Language="CS">
<ExternalLibrary Path="RDotNet.dll" />
<ExternalLibrary Path="RDotNet.NativeLibrary.dll" />
<Reference Name="RDotNet" />
<Reference Name="RDotNet.NativeLibrary" />
<![CDATA[
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using ExcelDna.Integration;
using RDotNet;
namespace CSLib
{
public class CSLib
{
static REngine rengine = null;
static CSLib()
{
// Set the folder in which R.dll locates.
var oldPath = System.Environment.GetEnvironmentVariable("PATH");
var rPath = @"C:\Program Files\R\R-3.0.1\bin\x64";
var newPath = string.Format("{0}{1}{2}", rPath, System.IO.Path.PathSeparator, oldPath);
System.Environment.SetEnvironmentVariable("PATH", newPath);
rengine = REngine.CreateInstance("RDotNet");
}
[ExcelFunction(Description = "get random numbers obey to normal distribution")]
public static double [] MyRnorm(int number)
{
return (rengine.Evaluate("rnorm(" + number + ")").AsNumeric().ToArray<double>());
}
}
}
]]>
</DnaLibrary>
Но я не мог заставить его работать ...
После попытки старых версий r.net я также попробовал новую версию со старым кодом, а затем я попытался adaptthe пример кода, присутствующего на сайте R.Net в коде выше, предполагая, что инициализацию г двигатель теперь использует путь в реестре:
<DnaLibrary RuntimeVersion="v4.0" Name="R.NET" Description="R.NETExcel" Language="CS">
<Reference Path="RDotNet.NativeLibrary.dll" />
<Reference Path="RDotNet.dll" />
<Reference Path="DynamicInterop.dll" />
<![CDATA[
using System;
using System.IO;
using System.Linq;
using RDotNet;
using DynamicInterop;
namespace CSLib
{
public class CSLib
{
public static double[] MyRnorm(int number)
{
REngine.SetEnvironmentVariables();
REngine engine = REngine.GetInstance();
engine.Initialize();
return (engine.Evaluate("rnorm(" + number + ")").AsNumeric().ToArray<double>());
engine.Dispose();
}
}
}
]]>
</DnaLibrary>
этот также не дает никаких результатов. Функция Excel возвращает #num ошибку.
Я уверен, что ExcelDNA работает, когда я прокомментирую раздел, пытающийся подключиться к R и вставить другую простую функцию, такую как сумма двух значений.
Я считаю, что мои проблемы могут быть связаны с новыми разработками в RdotNet, делая примерный код выше устаревшего (например, это может быть новый способ инициализации экземпляра REngine). Я также задаюсь вопросом о возможности конфликта 32 бит/64 бит, поэтому я также попытался заставить его работать с 32-разрядным, win xp, dot.net 4.0 - без каких-либо результатов.
Какой должен быть правильный способ подключения ExcelDNA к текущей версии R.NET?
Благодарим вас за помощь.
У вас есть сам R? – Govert
Вы можете получить #NUM из своего последнего примера, если вы вызываете его с помощью 0 или опускаете параметр в формуле Excel и называете его '= MyRnorm()'. Это верно. – Govert