R DataFrame объект с WCF - PullRequest
       22

R DataFrame объект с WCF

0 голосов
/ 14 ноября 2018

У меня очень смутное понимание WCF, но после небольшого исследования я понял, что WCF не нравится обрабатывать пользовательские объекты.Я ищу возможный обходной путь.

Это моя цель.Я стремлюсь создать службу WCF, которая принимает определенные значения от клиентского компьютера, отправляет их на сервер, где он вызывает экземпляр R и выполняет набор преобразований DataFrame и возвращает полученный DataFrame.Кажется, что DataFrames имеют формат векторного / 2D-массива.Я получаю сообщение об ошибке: операция не поддерживается в wcf, поскольку она использует тип system.object [] []

, см. Пример кода ниже -

        public string R_to_SQLstring_InsertTable(string table_name, DataFrame Table)
    {
        string query2 = "INSERT INTO table_name (";

        for (int x = 0; x < Table.ColumnCount; x++)
        {
            if (x == (Table.ColumnCount) - 1)
            {
                query2 = query2 + Table.Names[x] + "";
            }
            else
            {
                query2 = query2 + Table.Names[x] + ", ";
            }

        }
        query2 = query2 + ") Values (";


        for (int count1 = 0; count1 < Table.RowCount; count1++)
        {
            for (int count2 = 0; count2 < Table.ColumnCount; count2++)
            {
                if (count2 == (Table.ColumnCount) - 1)
                {
                    query2 = query2 + " " + Table[count2][count1];
                }
                else
                {
                    query2 = query2 + " " + Table[count2][count1] + ",";
                }

            }

            if (count1 == (Table.RowCount) - 1)
            {
                query2 = query2 + ");";
            }
            else
            {
                query2 = query2 + "), (";
            }

        }
        return query2;
    }



    public DataFrame R_Transformation_MergeTable(string tableloca1, string tableloca2)
    {

        StartupParameter rinit = new StartupParameter();
        rinit.Quiet = true;
        rinit.RHome = @"C:\Program Files\R\R-3.4.4\";
        rinit.Home = @"C:\R";
        REngine.SetEnvironmentVariables();
        REngine engine = REngine.GetInstance(null, true, rinit);

        try
        {
            engine.Evaluate("Table1 <- read.csv(file='" + tableloca1+")");
            engine.Evaluate("Table2 <- read.csv(file='" + tableloca2 + ")");

            DataFrame Table = engine.Evaluate("Merge <- merge(Table1,Table2)").AsDataFrame();
            return Table;
        }
        catch (Exception x)
        {

            throw new Exception("Please Upload .CSV file");

        }


    }

1 Ответ

0 голосов
/ 14 ноября 2018

Я передаю универсальные объекты через WCF, вручную сериализуя их в byte [] и передавая определение типа (в виде строки, тип также не может проходить через WCF), а затем приводя его обратно к нужному типу с помощью отражения. Учитывая объект [] [], вам, возможно, придется перебирать его и использовать отражение, чтобы определить тип каждой записи для этой цели.

Лучшей техникой, если это возможно, было бы приведение объектов к типу контракта данных перед отправкой их через службу.

...