5 // See comments in src/sources/EMGrank.c and R/EMGrank.R (wrapper)
16 // Get matrices dimensions
17 SEXP dimX
= getAttrib(X_
, R_DimSymbol
);
18 int n
= INTEGER(dimX
)[0];
19 int p
= INTEGER(dimX
)[1];
20 SEXP dimRho
= getAttrib(Rho_
, R_DimSymbol
);
21 int m
= INTEGER(dimRho
)[0];
22 int k
= INTEGER(dimRho
)[2];
28 // get scalar parameters
29 int mini
= INTEGER_VALUE(mini_
);
30 int maxi
= INTEGER_VALUE(maxi_
);
31 double eps
= NUMERIC_VALUE(eps_
);
33 // Get pointers from SEXP arrays ; WARNING: by columns !
34 double* Pi
= REAL(Pi_
);
35 double* Rho
= REAL(Rho_
);
38 int* rank
= INTEGER(rank_
);
44 SEXP phi
, LLF
, dimPhi
;
45 PROTECT(dimPhi
= allocVector(INTSXP
, 3));
46 int* pDimPhi
= INTEGER(dimPhi
);
47 pDimPhi
[0] = p
; pDimPhi
[1] = m
; pDimPhi
[2] = k
;
48 PROTECT(phi
= allocArray(REALSXP
, dimPhi
));
49 PROTECT(LLF
= allocVector(REALSXP
, 1));
50 double *pPhi
=REAL(phi
), *pLLF
=REAL(LLF
);
56 EMGrank_core(Pi
, Rho
, mini
, maxi
, X
, Y
, eps
, rank
,
60 // Build list from OUT params and return it
61 SEXP listParams
, listNames
;
62 PROTECT(listParams
= allocVector(VECSXP
, 2));
63 char* lnames
[2] = {"phi", "LLF"}; //lists labels
64 PROTECT(listNames
= allocVector(STRSXP
,2));
65 for (int i
=0; i
<2; i
++)
66 SET_STRING_ELT(listNames
,i
,mkChar(lnames
[i
]));
67 setAttrib(listParams
, R_NamesSymbol
, listNames
);
68 SET_VECTOR_ELT(listParams
, 0, phi
);
69 SET_VECTOR_ELT(listParams
, 1, LLF
);