gpt4 book ai didi

c# - 如何让 ExcelDNA 与 R.Net 一起工作

转载 作者:行者123 更新时间:2023-11-30 21:59:25 27 4
gpt4 key购买 nike

我是 C# 和 R 初学者,正在尝试运行示例 http://mockquant.blogspot.com/2011/07/yet-another-way-to-use-r-in-excel-for.html

<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(我的 cpu 系统是 win7/64 位)

我尝试使用早期稳定版本的 RDotNet 并在 google 上搜索示例代码的更新,例如。这里:

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 之后,我还尝试了使用旧代码的最新版本,然后我尝试将 R.Net 网站上的示例代码改编为上面的代码,假设 r 引擎的初始化现在使用注册表中的路径:

<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 错误。

当我注释掉试图连接到 R 的部分并粘贴一些其他简单函数(例如对两个值求和)时,我确信 ExcelDNA 可以正常工作。

我相信我的问题可能与 RdotNet 中的新开发有关,使得上面的示例代码已过时(例如,它可能是初始化 REngine 实例的新方法)。我也想知道 32 位/64 位冲突的可能性,这就是为什么我也试图让它在 32 位、win xp、dot.net 4.0 上工作——但没有结果。

那么将 ExcelDNA 连接到当前 R.NET 版本的正确方法应该是什么?

非常感谢您的帮助。

最佳答案

这些步骤对我来说效果很好:

  1. 确保安装了 R。在我的 Windows“添加或删除程序”列表中,我看到“R for Windows 3.02”。

  2. 在 Visual Studio 中创建一个新的“类库”项目。

  3. 在 NuGet 包管理器控制台中,执行命令:

    PM> Install-Package Excel-DNA
    PM> Install-Package R.NET.Community
  4. 将以下代码添加到主 .cs 文件中:

    using System;
    using System.Linq;
    using ExcelDna.Integration;
    using ExcelDna.Logging;
    using RDotNet;

    namespace UsingRDotNet
    {
    public class AddIn : IExcelAddIn
    {
    public void AutoOpen()
    {
    MyFunctions.InitializeRDotNet();
    }

    public void AutoClose()
    {
    }
    }

    public static class MyFunctions
    {
    static REngine _engine;
    internal static void InitializeRDotNet()
    {
    try
    {
    REngine.SetEnvironmentVariables();
    _engine = REngine.GetInstance();
    _engine.Initialize();
    }
    catch (Exception ex)
    {
    LogDisplay.WriteLine("Error initializing RDotNet: " + ex.Message);
    }
    }

    public static double[] MyRnorm(int number)
    {
    return (_engine.Evaluate("rnorm(" + number + ")").AsNumeric().ToArray<double>());
    }

    public static object TestRDotNet()
    {
    // .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();

    return string.Format("Group1: [{0}], Group2: [{1}], P-value = {2:0.000}", string.Join(", ", group1), string.Join(", ", group2), p);
    }
    }
    }
  5. F5 在 Excel 中运行加载项。

  6. 输入公式 =TestRDotNet()and=MyRNorm(5)`。数字显示在 Excel 中。

我已将“UsingRDotNet”项目添加到 Excel-DNA Samples on GitHub .

关于c# - 如何让 ExcelDNA 与 R.Net 一起工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29279908/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com