如何使用RdotNet创建S4对象

时间:2015-12-18 11:58:53

标签: c# r r.net

使用 R.NET 创建S4 objectmirt包中的函数输出。

engine.Evaluate("library(mirt); data(LSAT6); x=mirt(LSAT6,1)");
S4Object Convertedinput = inputtoCsharp.AsS4();

我需要将x的输出(x的所有插槽)都显示在消息框中。

我该怎么做?

因为没有方法可以做到这样的事情:

int[] resp_c = new int  [] {1,1,1,1};
**IntegerVector resp_cR = engine.CreateIntegerVector(resp_c);**
engine.SetSymbol("resp_c", resp_cR);
engine.Evaluate("ff=fscores(x, response.pattern=resp_c)");

上面的事情是针对整数向量做的。我需要为R中的S4 object模拟相同的内容。

我将如何做到这一点?

1 个答案:

答案 0 :(得分:1)

不完全确定我理解您的请求,但下面的示例代码应该有所帮助。它也可以从文件/ReproUsers/Program.cs中的An R.NET support github repo方法ReproStackOverflow_34355201获得。供将来参考,written at commit 43a8ec3

engine.AutoPrint = true;
//samples taken from ?fscores man page in package mirt
engine.Evaluate("library(mirt)");
// 'Science' is a prepackage sample data in mirt; you can use 'engine.CreateDataFrame' in C# to create your own if need be.
engine.Evaluate("mod <- mirt(Science, 1)");
engine.Evaluate("class(mod)");
S4Object modcs = engine.GetSymbol("mod").AsS4();
IDictionary<string, string> slotTypes = modcs.GetSlotTypes();
if (slotTypes.Keys.Contains("Fit"))
{
    GenericVector fit = modcs["Fit"].AsList();
    // should check logLik in fit.Names;
    double logLik = fit["logLik"].AsNumeric()[0];
}
engine.Evaluate("tabscores <- fscores(mod, full.scores = FALSE)");
engine.Evaluate("head(tabscores)");
engine.Evaluate("class(tabscores)");
NumericMatrix tabscorescs = engine.GetSymbol("tabscores").AsNumericMatrix();