diff --git a/src/fmelt.c b/src/fmelt.c index f5184dd8f7..f54ba17fb0 100644 --- a/src/fmelt.c +++ b/src/fmelt.c @@ -441,7 +441,7 @@ SEXP getvaluecols(SEXP DT, SEXP dtnames, Rboolean valfactor, Rboolean verbose, s for (k=0; knrow*size, (char *)DATAPTR(thiscol), data->nrow*size); + memcpy((char *)REAL(target)+j*data->nrow*size, (char *)REAL(thiscol), data->nrow*size); } break; case INTSXP : @@ -449,7 +449,7 @@ SEXP getvaluecols(SEXP DT, SEXP dtnames, Rboolean valfactor, Rboolean verbose, s for (k=0; knrow*size, (char *)DATAPTR(thiscol), data->nrow*size); + memcpy((char *)INTEGER(target)+j*data->nrow*size, (char *)INTEGER(thiscol), data->nrow*size); } break; case LGLSXP : @@ -457,7 +457,7 @@ SEXP getvaluecols(SEXP DT, SEXP dtnames, Rboolean valfactor, Rboolean verbose, s for (k=0; knrow*size, (char *)DATAPTR(thiscol), data->nrow*size); + memcpy((char *)LOGICAL(target)+j*data->nrow*size, (char *)LOGICAL(thiscol), data->nrow*size); } break; default : error("Unknown column type '%s' for column '%s'.", type2char(TYPEOF(thiscol)), CHAR(STRING_ELT(dtnames, INTEGER(thisvaluecols)[i]-1))); @@ -573,7 +573,7 @@ SEXP getidcols(SEXP DT, SEXP dtnames, Rboolean verbose, struct processData *data } } else { for (j=0; jlmax; j++) - memcpy((char *)DATAPTR(target)+j*data->nrow*size, (char *)DATAPTR(thiscol), data->nrow*size); + memcpy((char *)REAL(target)+j*data->nrow*size, (char *)REAL(thiscol), data->nrow*size); } break; case INTSXP : @@ -587,7 +587,7 @@ SEXP getidcols(SEXP DT, SEXP dtnames, Rboolean verbose, struct processData *data } } else { for (j=0; jlmax; j++) - memcpy((char *)DATAPTR(target)+j*data->nrow*size, (char *)DATAPTR(thiscol), data->nrow*size); + memcpy((char *)INTEGER(target)+j*data->nrow*size, (char *)INTEGER(thiscol), data->nrow*size); } break; case LGLSXP : @@ -601,7 +601,7 @@ SEXP getidcols(SEXP DT, SEXP dtnames, Rboolean verbose, struct processData *data } } else { for (j=0; jlmax; j++) - memcpy((char *)DATAPTR(target)+j*data->nrow*size, (char *)DATAPTR(thiscol), data->nrow*size); + memcpy((char *)LOGICAL(target)+j*data->nrow*size, (char *)LOGICAL(thiscol), data->nrow*size); } break; case STRSXP : @@ -614,11 +614,12 @@ SEXP getidcols(SEXP DT, SEXP dtnames, Rboolean verbose, struct processData *data counter += thislen; } } else { - // SET_STRING_ELT for j=0 and memcpy for j>0, WHY? - // From assign.c's memcrecycle - only one SET_STRING_ELT per RHS item is needed to set generations (overhead) - for (k=0; knrow; k++) SET_STRING_ELT(target, k, STRING_ELT(thiscol, k)); - for (j=1; jlmax; j++) - memcpy((char *)DATAPTR(target)+j*data->nrow*size, (char *)DATAPTR(target), data->nrow*size); + const SEXP *s = STRING_PTR(thiscol); // to reduce overhead of STRING_ELT() inside loop below. Read-only hence const. + for (j=0; jlmax; j++) { + for (k=0; knrow; k++) { + SET_STRING_ELT(target, j*data->nrow + k, s[k]); + } + } } break; case VECSXP : diff --git a/src/gsumm.c b/src/gsumm.c index a5fa1946ef..419d0459e2 100644 --- a/src/gsumm.c +++ b/src/gsumm.c @@ -791,7 +791,7 @@ SEXP gmedian(SEXP x, SEXP narm) { isint64 = (isString(klass) && STRING_ELT(klass, 0) == char_integer64); ans = PROTECT(allocVector(REALSXP, ngrp)); sub = PROTECT(allocVector(REALSXP, maxgrpn)); // allocate once upfront - ptr = DATAPTR(sub); + ptr = REAL(sub); if (!LOGICAL(narm)[0]) { for (i=0; i