Передача DataTable через COM в R - PullRequest
3 голосов
/ 30 июня 2010

Я пытаюсь передать данные из SQL в C #, затем на R-сервер для анализа данных, а затем обратно в мое веб-приложение; однако используемый мной COM-интерфейс не позволяет передавать сложные типы данных между C # и R (без таблиц данных). Я получил его в прошлом, используя следующий код:

    int count = dataTable.Rows.Count;
    object[] y = new object[count];
    object[] x = new object[count];

    //R does not accept DataTables, so here we extract the data from
    //the table and pass it into 2 double arrays.
    for (int i = 0; i < count; i++)
    {
        y[i] = Convert.ToDouble(dataTable.Rows[i][0]);
        x[i] = Convert.ToDouble(dataTable.Rows[i][1]);
    }
    //Instantiate R connection
    StatConnector r = new STATCONNECTORSRVLib.StatConnectorClass();
    r.Init("R");
    r.SetSymbol("y", y);  //Passes column y into R
    r.SetSymbol("x", x);  //Passes column x into R

Моя проблема теперь возникает из-за того, что я больше не ограничен только удваиваниями, все, что выходит из базы данных SQL, является честной игрой (int, varchar и т. Д.), И что я больше не вызываю только 2 столбца данных (может быть сколько угодно, сколько указано пользователем).

Как я могу преобразовать данные динамического размера и динамических типов данных в массив, который можно было бы безопасно передать в rcom?

Ответы [ 2 ]

2 голосов
/ 30 июня 2010

В Профессиональные бизнес-объекты Visual Basic 6.0 . Автор: Rockford Lhotka (http://search.barnesandnoble.com/Professional-Visual-Basic-60-Business-Objects/Rockford-Lhotka/e/9781861001078),), который делает различные заявления о том, что наиболее эффективной структурой передачи данных между интерфейсами COM через границы приложения является строка. Я знаю, правда ли это, но я принимаю его квалификацию. Поэтому я считаю, что предложение Биффа МаГриффа было бы хорошим простым решением вашей проблемы.

2 голосов
/ 30 июня 2010

Я бы использовал CSV.Конечно, я ничего не знаю о RCOM: s Удачи!

public static string DataTableToCSV(DataTable myTable)
{
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < myTable.Columns.Count; i++)
    {
        sb.Append("\"");
        sb.Append(myTable.Columns[i].ColumnName);
        sb.Append("\"");
        if (i < myTable.Columns.Count - 1)
            sb.Append(",");
    }
    sb.AppendLine();
    foreach (DataRow dr in myTable.Rows)
    {
        for (int i = 0; i < dr.ItemArray.Length; i++)
        {
            sb.Append("\"");
            sb.Append(dr.ItemArray[i].ToString());
            sb.Append("\"");
            if (i < dr.ItemArray.Length - 1)
                sb.Append(",");
        }
        sb.AppendLine();
    }
    return sb.ToString();
}
...