将十进制值从 dataTable 传递到 dataFrame 失败

Passing decimal values from dataTable to dataFrame fails

我创建了此代码示例以将 c# DataTable 类型的对象传递给 R.Net dataFrame。

public static DataFrame ConvertDataTableToRDataFrame(DataTable tab)
{
    REngine.SetEnvironmentVariables();
    REngine engine = REngine.GetInstance();
    double?[,] stringData = new double?[tab.Rows.Count, tab.Columns.Count];
    DataFrame df = engine.Evaluate("df=NULL").AsDataFrame();
    int irow = 0;
    foreach (DataRow row in tab.Rows)
    {
        NumericVector x = engine.Evaluate("x=NULL").AsNumeric();
        int icol = 0;
        foreach (DataColumn col in tab.Columns)
        {
            if (row.Field<double?>(col) == null)
            {
                x = engine.Evaluate("x=c(x, NA) ").AsNumeric();
            }
            else { x = engine.Evaluate("x=c(x, " + row.Field<double?>(col) + ") ").AsNumeric(); }
            icol++;
        }
        df = engine.Evaluate("df= as.data.frame(rbind(df,x)) ").AsDataFrame();
        irow++;
    }
    return (df);
}

在我尝试检查数据框的内容之前,一切似乎都运行良好。我发现像 1.2355 这样的值在数据框中变成了 12355。由于某些未知原因,它无法将 . 识别为小数点分隔符。

-添加@Panagiotis Kanavos 命题作为答案,因为它解决了问题-

小数没有任何特定的小数分隔符,它们是二进制值。仅当将它们转换为字符串时才使用分隔符。根据定义,row.Field<double?>(col) 的输出将是 Nullable<double>,但将其连接到字符串会使用当前用户的区域性将其转换为字符串。

改用String.Format(CultureInfo.InvariantCulture,"x=c(x, {0})" ,row.Field<double?>(col)),或"x=c(x, " + row.Field<double?>(col).ToString(CultureInfo.InvariantCulture) + ") "