Как получить кадр данных из R в C # с помощью RserveCLI2 - PullRequest
0 голосов
/ 25 апреля 2018

Я пытаюсь получить фрейм данных из среды R в C # с помощью пакета RServeCLI2.Я не могу найти правильный способ сделать это.Это не должно быть так сложно.

В C # я сделал:

using System;
using RserveCLI2;

class TestMain
{
         public static void Main(string[] args)
         {
            var r = RConnection.Connect(new System.Net.IPAddress(new byte[] { 127, 0, 0, 1 }), port: 6311);

            r.VoidEval("options(stringsAsFactors = FALSE)");
            r.VoidEval("samplePOSIXct <- as.POSIXct(c('2018-03-28 01:45:00', '2018-03-23 02:00:00', '2018-03-22 03:00:00'))");
            r.VoidEval("sampleDate <- as.Date(c('2018-03-24', '2018-02-05', '2018-01-30'))");
            r.VoidEval("sampleLogical <- as.logical(c(TRUE, FALSE, FALSE))");
            r.VoidEval("sampleNumeric <- as.numeric(c(1,NA,5))");
            r.VoidEval("sampleCharacter <- as.character(c('ik', 'wil', 'bolletje'))");
            r.VoidEval("df <- data.frame(samplePOSIXct, sampleDate, sampleLogical, sampleNumeric, sampleCharacter)");

            Sexp dataset = r["df"];

            for (int rows = 0; rows < dataset.Attributes.Count; rows++)
            {
                for (int cols = 0; cols < dataset.Names.Length; cols++)
                {
                    Console.WriteLine(string.Format("Col: {0}, Row: {1}",
                        dataset.Names[cols], dataset.AsDictionary[dataset.Names[cols]]));
                }
            }
            var exit = Console.ReadLine();
         }
}

Это работает успешно, однако результаты не то, что я хочу.Все строки печатаются с каждым вызовом.Результаты:

#Col: samplePOSIXct, Row: 1522194300 1521766800 152168400
#Col: sampleDate, Row: 24-03-2018 05-02-2018 30-01-2018
#...

Как получить значения, напечатанные следующим образом?

#Ideal output
#Col: samplePOSIXct Row: 1522194300
#Col: samplePOSIXct Row: 1521766800
#Col: samplePOSIXct Row: 1521684000
#Col: sampleDate Row: 24-03-2018
#...

1 Ответ

0 голосов
/ 25 апреля 2018

Я нашел ответ, он может быть хакерским, но я доволен этим. Я извлек каждый столбец кадра данных в первом цикле, поместив его в IList<object>, а во втором цикле извлекая каждое значение.

//...
Sexp dataset = r["df"];

for(int cols = 0; cols < dataset.Names.Length; cols++)
{
    IList<object> datasetL = r[$"df[,{cols + 1}]"].AsList;
    for(int rows = 0; rows < dataset.Attributes.Count; rows++)
    {
        Console.WriteLine($"Col: {dataset.Names[cols]}, Row: {datasetL[rows].ToString()}");
    }

}
//...

#Results
#Col: samplePOSIXct, Row: 1522194300
#Col: samplePOSIXct, Row: 1521766800
#Col: samplePOSIXct, Row: 1521684000
#Col: sampleDate, Row: 17614
#...

Если кто-нибудь знает лучший ответ (для эффективности), я открыт для тех,

...