首页 > 解决方案 > RServeCLI 试图理解 C# 中的数据帧

问题描述

我正在尝试让 RServeCLI 客户端使用 RServe 在 C# 中工作。我从示例代码开始,一切都在运行,包括源文件、评估函数等。但是,我并不真正了解 Sexp 值是如何传递的。例如,在创建的数据框中,它看起来是一个 20 X 2 矩阵,20 行,2 列(一个用于 x,一个用于 y)。

这是我在 C# 中的代码:

    var x = Enumerable.Range(1, 20).ToArray();
    var y = (from a in x select (0.5 * a * a) + 2).ToArray();


    Console.WriteLine("Testing d: ");
    // Build an R data frame
    var d = Sexp.MakeDataFrame();
    d["x"] = Sexp.Make(x);
    d["y"] = Sexp.Make(y);
    s["d"] = d;

    Console.WriteLine("Writing d original");
    Console.WriteLine(d.ToString());
    Console.WriteLine("Writing from s[d]: ");
    Console.WriteLine("");
    Console.WriteLine(s["d$x"].ToString());

    Console.WriteLine("");
    Console.WriteLine("Testing dimensions");

    Sexp dimNum = s.Eval("dim(d)");
    Console.WriteLine("Dimensions: " + dimNum[0].ToString() + " x " + dimNum[1].ToString());

这是输出。请注意,返回的尺寸显示为 0 x 2,而不是预期的 20 x 2。

测试 d: 写作 d 原创 [ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20, 2.5 4 6.5 10 14.5 20 26.5 34 42.5 52 62.5 74 86.5 100 4 6.52 6 4 182 182 1来自 s[d]:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20

测试尺寸 尺寸:0 x 2

有人可以解释一下吗?我将向 R 传递大量数据数组以形成 tibbles / dataframes,然后在函数中对其进行操作。我只需要更好地理解 C# 中这些类型的格式以及它们是如何传递的。(旁注,是否有一种方法可以通过 R 与 Rserve 进行交互,以查看服务器端发生了什么以便进行调试?)谢谢。

更新: 为了我的目的,我能够得到一些工作。这是 C# 中的一些新测试代码:

    double[] a = new double[] { 1.1, 1.2, 1.3, 1.4 };
    s["newrow"] = Sexp.Make(a);
    var newrowdim = s.Eval("dim(newrow)");
    var newrowlength = s.Eval("length(newrow)");
    Console.WriteLine("newrow dim: " + newrowdim.ToString() + " newrow length: " + newrowlength.ToString());


    var r = s.Eval("dim(x_data)[1]");
    var c = s.Eval("dim(x_data)[2]");
    Console.WriteLine("");
    Console.WriteLine("Rows: " + r.ToString() + " Cols: " + c.ToString());
    s.Eval("x_data <- rbind(x_data, newrow)");

    var nr = s.Eval("dim(x_data)[1]");
    var nc = s.Eval("dim(x_data)[2]");
    Console.WriteLine("");
    Console.WriteLine("New Rows: " + nr.ToString() + " New Cols: " + nc.ToString());

说明:a 是 C# 中的向量,我在 R 中将其制成称为 newrow 的向量。我可以看到尺寸返回为 NULL(从 R 中正确),并且长度是预期的向量的长度。

在 R 中,我创建了一个名为 x_data 的尺寸为 1x4 的 tibble,以测试将 C# 向量添加到 tibble。我使用 C# 中的命令来执行此操作: s.Eval("x_data <- rbind(x_data, newrow)");

现在,我检查了新更新的 x_data 的尺寸,它符合预期,2x4(它有添加的行)。

希望这对某人有帮助;它现在对我有用。原来的问题仍然存在。这是代码的输出和 R 代码。

新行暗淡:NULL 新行长度:4

行:1 列:4

新行:2 新列:4 完成

library(tibble)
   
x_data <- as_tibble(matrix(rep(0, 4), nrow=1))

标签: c#rrserve

解决方案


推荐阅读