@@ -826,7 +826,10 @@ static SEXP get_list(SEXP len, SEXP val, size_t elmsize, bool is_factor)
826826 }
827827 vv = ZeroLen;
828828 } else {
829- vv = Rf_allocVector (TYPEOF (val), nn);
829+ if (elmsize <= 1 )
830+ vv = Rf_allocVector (TYPEOF (val), nn);
831+ else
832+ vv = Rf_allocMatrix (TYPEOF (val), elmsize, psel[i]);
830833 if (is_factor)
831834 {
832835 SET_CLASS (vv, GET_CLASS (val));
@@ -866,6 +869,24 @@ static SEXP get_list(SEXP len, SEXP val, size_t elmsize, bool is_factor)
866869
867870// .List_IRanges_value
868871extern " C" SEXP OBJ_CompressedList = NULL ;
872+ // as(, "List")
873+ extern " C" SEXP LANG_AS_LIST = NULL ;
874+
875+ // / create a S4Vectors::List object
876+ inline static SEXP as_s4vectors_list (SEXP x)
877+ {
878+ // LANG_AS_LIST = quote(as(object, "List"))
879+ SEXP epr = PROTECT (LANG_AS_LIST);
880+ // set parameters
881+ SETCADR (epr, x); // parameter: object
882+ // call
883+ SEXP rv = PROTECT (Rf_eval (epr, R_GlobalEnv));
884+ // free
885+ SETCADR (epr, R_NilValue); // parameter: object
886+ // output
887+ UNPROTECT (2 );
888+ return rv;
889+ }
869890
870891// / convert to a compressed list in IRanges
871892static SEXP get_list2 (SEXP len, SEXP val, bool is_factor)
@@ -1013,8 +1034,11 @@ static SEXP get_info(CFileInfo &File, TVarMap &Var, void *param)
10131034 // convert to a list
10141035 size_t d2 = (Var.NDim < 2 ) ? 1 : dimcnt[1 ];
10151036 if ((P->tolist == TRUE ) || (d2 != 1 ))
1037+ {
10161038 rv_ans = get_list (I32, val, d2, is_factor);
1017- else
1039+ if (P->tolist == NA_INTEGER)
1040+ rv_ans = as_s4vectors_list (rv_ans);
1041+ } else
10181042 rv_ans = get_list2 (I32, val, is_factor);
10191043 } else {
10201044 // create `list(length, data)`
0 commit comments