1

R.Net を VB.NET で動作させようとしています。公式の例を c# から vb.net に翻訳しましたが、うまくいきません。私が試したさまざまなものがあります。まず、公式ページで説明されているように SetupHelper を使用しました。

Imports System.IO

Namespace RDotNetSetup

Public Class SetupHelper
Public Shared Sub SetupPath()
    Dim oldPath = System.Environment.GetEnvironmentVariable("PATH")
    Dim rPath = If(System.Environment.Is64BitProcess, "C:\Program Files\R\R-3.0.2\bin\x64", "C:\Program Files\R\R-3.0.2\bin\i386")
    If Directory.Exists(rPath) = False Then
        Throw New DirectoryNotFoundException(String.Format("Could not found the specified path to the directory containing R.dll: {0}", rPath))
    End If
    Dim newPath = String.Format("{0}{1}{2}", rPath, System.IO.Path.PathSeparator, oldPath)
    System.Environment.SetEnvironmentVariable("PATH", newPath)
End Sub
End Class
End Namespace

Imports RDotNet
Imports ConsoleApplication36.RDotNetSetup
Imports System.Collections.Generic
Imports System.IO
Imports System.Linq
Imports System.Text
Imports System.Threading.Tasks

Module Module1

Sub Main()
SetupHelper.SetupPath()
Using engine As REngine = REngine.CreateInstance("RDotNet")
    engine.Initialize()
    Dim charVec As CharacterVector = engine.CreateCharacterVector({"Hello, R world!, .NET speaking"})
    engine.SetSymbol("greetings", charVec)
    engine.Evaluate("str(greetings)")
    Dim a As String() = engine.Evaluate("'Hi there .NET, from the R engine'").AsCharacter().ToArray()
    Console.WriteLine("R answered: '{0}'", a(0))
    Console.WriteLine("Press any key to exit the program")
    Console.ReadKey()
End Using
End Sub
End Module

engine.Initialize でデバッガーを使用してもエラーは発生しません。テストの実行が停止します (緑色の開始矢印が再表示されます)。

それで、VB.Netで(明らかに)動作するはずの別の例を見つけました

Imports RDotNet
Imports System.IO
Imports System.Linq

Module Module1

Sub Main()
    Dim envPath = System.Environment.GetEnvironmentVariable("PATH")
    Dim rBinPath = "C:\Program Files\R\R-3.0.2\bin\i386"
    System.Environment.SetEnvironmentVariable("PATH", envPath & Path.PathSeparator & rBinPath)
    Dim engine As REngine = REngine.CreateInstance("RDotNet")
    Dim group1 As NumericVector = 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.
    Dim s = "group2 <- c(29.89, 29.93, 29.72, 29.98, 30.02, 29.98)"
    Dim group2 = engine.Evaluate(s).AsNumeric()
    Dim testResult As GenericVector = engine.Evaluate("t.test(group1, group2)").AsList()
    Dim p As Double = 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)
End Sub
End Module

ライターが同じ問題を抱えていて、engine.initialize を終了したようです。コードを実行すると、「値が範囲外です」というエラーが表示されDim group1 As NumericVector = engine.CreateNumericVector(New Double() {30.02, 29.99, 30.11, 29.97, 30.01, 29.99})ます。

VB.NET のサンプル コードを動作させるのを手伝ってくれる人はいますか? 初期化できない理由を教えてください。

fyi: パスを確認し、必要なすべての参照を設定しました。

4

1 に答える 1

0

わかりました、何時間もの試行と議論の後でうまくいきます。私がしたこと:

  1. .net 4.5 を .net 4.0 に変更しました
  2. コンパイラの設定を「AnyCPU」から「x86」に変更しました
  3. 「 」の最初の行は次のSetupPath()とおりです。System.Environment.SetEnvironmentVariable("R_HOME", "C:\Program Files\R\R-3.0.2")
于 2013-11-09T10:00:09.860 に答える