2014-12-29 1 views
0

Я прочитал об импорте данных из текстового файла в R и обработке этих данных и сохранении его в переменной aC# с использованием R (D) COM. Но то, что я хочу сделать, - импортировать массив/список C# в переменную r и выполнить обработку в этом массиве.R (D) COM как импортировать массивы C# в R, чтобы применить некоторые R-алгоритмы на нем

Я использовал R.NET, с которым я мог бы все это, но неразрешенные ошибки, такие как проблема engine.dispose() и проблема с правами доступа, которые я получаю, когда код запускается дважды, заставили меня искать другой интерфейс и i закончил с R (D) COM.

Любая помощь будет оценена по достоинству.

Проблемы использования R.NET:(New редактировать)

Я использовал R.NET но имел StackOverflow ошибку для второго запуска. Так используется следующий фрагмент кода для очистки памяти:

engine.Evaluate("rm(gp)"); 
         engine.Evaluate("rm(len)"); 
         engine.Evaluate("rm(full1)"); 
         engine.Evaluate("rm(full)"); 
         engine.Evaluate("rm(date)"); 
         engine.Evaluate("rm(value)"); 
         engine.Evaluate("rm(values)"); 
         engine.Evaluate("rm(partial)"); 
         engine.Evaluate("rm(modval)"); 
         engine.Evaluate("rm(myts)"); 

         engine.Evaluate("rm(fit)"); 
         engine.Evaluate("rm(h)"); 
         engine.Evaluate("rm(test)"); 
         engine.Evaluate("rm(testframe)"); 
         engine.Evaluate("rm(meanv)"); 
         engine.Evaluate("rm(lowv)"); 
         engine.Evaluate("rm(highv)"); 
         engine.Evaluate("rm(start1)"); 
         engine.Evaluate("rm(mod)"); 
         engine.Evaluate("gc()"); 

         engine.Evaluate("rm(list = ls(all = TRUE))"); 
         engine.Evaluate("gc()"); 

         GC.Collect(); 
         engine.ForceGarbageCollection(); 

но теперь я получаю «System.AccessViolationException» в заявлении

engine.Evaluate("fit<-ets(myts,model=mod,damped=NULL)") 

Просьба помочь мне ..

+0

Очень простым решением было бы сохранить ваши данные C# в виде файла csv и запустить RScript для обработки файла (возможно, для возврата данных через дополнительный файл). – etov

ответ

0

Я не могу ответить на относительно R (D) COM, но нет никакой проблемы с R.NET, чтобы делать то, что вы описываете, насколько я вижу. См. https://github.com/jmp75/rdotnet-onboarding, включая недавно добавленный проект SupportSamples, воспроизведенный ниже для информации. Это было просто отлично, по крайней мере на Linux-боксе.

Я подозреваю, что вы вызываете engine.Dispose() несколько раз. Не называйте это, пока вы не сделаете все расчеты. Ограничение R, а не ошибка R.NET. Если у вас все еще есть проблема, зарегистрируйте его как таковой с воспроизводимым кодом.

Надеюсь, это поможет.

Код ниже Работали с помощью:

  • Linux 3.16.0-4-amd64
  • Mono JIT компилятор версии 3.12.1
  • R версия 3.1.2
  • MonoDevelop 5,5
  • R.NET 1.5.19

    static void stackoverflow_27689786_2752565() 
    { 
        REngine.SetEnvironmentVariables(); 
        REngine engine = REngine.GetInstance(); 
    
        var rand = new System.Random (0); 
        double[] randValues; 
    
        for (int i = 0; i < 10; i++) { 
         randValues = mkValues (rand, 100); 
         Console.WriteLine ("std dev iteration {0} = {1}", i + 1, calcSDev (engine, randValues)); 
        } 
        // you should always dispose of the REngine properly. 
        // After disposing of the engine, you cannot reinitialize nor reuse it 
        engine.Dispose(); 
    } 
    
    static double[] mkValues (Random rand, int n) 
    { 
        double[] res = new double[n]; 
        for (int i = 0; i < n; i++) { 
         var v = rand.NextDouble(); 
         res [i] = (v < 0 ? -1 : 1) * v * v; 
        } 
        return res; 
    } 
    
    static double calcSDev (REngine engine, double[] arr) 
    { 
        // Note: only one quick and slightly dirty way to do it 
        NumericVector rVector = engine.CreateNumericVector(arr); 
        engine.SetSymbol ("x", rVector); 
        return engine.Evaluate ("sd(x)").AsNumeric() [0]; 
    } 
    
+0

Я следил за вашими советами и использовал R.Net, но у меня были некоторые проблемы. Обязательно проверьте изменения в моем вопросе и помогите мне .. Спасибо .. – sadhana

+0

Я решил все эти проблемы и получил его работу на визуальной студии 2013 года. Но когда я опубликовать его в порт на моем Windows Server 2012, который он не работает. В журнале ошибок отображается ошибка «объект, не установленный в экземпляр» в «engine = REngine.ForceGarbageCollection()» в самом начале кода. пожалуйста, помогите мне. Приложение работает с IIS 8.1 .. – sadhana