Search code examples
c#rr.net

How to create an S4 Object using RdotNet


While using R.NET for creating an S4 object ( an output of a function from the mirt package.

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

I need to to see the output of x (all the slots of x) into a message box.

How can I do that?

because there is no method which does something like this:

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)");

above thing is done for the integer vector. I need to emulate same for the S4 object in R.

How will I be able to do that?


Solution

  • Not fully sure I understand your request, but the sample code below should help. It is also available from An R.NET support github repo, method ReproStackOverflow_34355201 in file /ReproUsers/Program.cs . For future reference, 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();