Skip to content

Commit aa39a45

Browse files
committed
further simplification (with a tip of the hat to Kevin)
1 parent c9dc0e2 commit aa39a45

File tree

2 files changed

+22
-27
lines changed

2 files changed

+22
-27
lines changed

ChangeLog

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
2015-11-11 Dirk Eddelbuettel <[email protected]>
2+
3+
* inst/include/Rcpp/vector/Matrix.h: Further simplification
4+
15
2015-11-11 Qiang Kou <[email protected]>
26

37
* include/Rcpp/complex.h: operator<< for Rcomplex

inst/include/Rcpp/vector/Matrix.h

Lines changed: 18 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -378,16 +378,13 @@ Matrix<REALSXP, StoragePolicy> transpose(const Matrix<REALSXP, StoragePolicy> &
378378
}
379379

380380
// there must be a simpler, more C++-ish way for this ...
381-
SEXP rnames = internal::DimNameProxy(x, 0);
382-
SEXP cnames = internal::DimNameProxy(x, 1);
383-
if (!Rf_isNull(rnames) || !Rf_isNull(cnames)) {
384-
SEXP dimnames;
385-
PROTECT(dimnames = Rf_allocVector(VECSXP, 2));
386-
SET_VECTOR_ELT(dimnames, 0, cnames);
387-
SET_VECTOR_ELT(dimnames, 1, rnames);
381+
SEXP dimNames = Rf_getAttrib(x, R_DimNamesSymbol);
382+
if (!Rf_isNull(dimNames)) {
388383
// do we need dimnamesnames ?
389-
Rf_setAttrib(r, R_DimNamesSymbol, dimnames);
390-
UNPROTECT(1); /* dimnames */
384+
Shield<SEXP> newDimNames(Rf_allocVector(VECSXP, 2));
385+
SET_VECTOR_ELT(newDimNames, 0, VECTOR_ELT(dimNames, 1));
386+
SET_VECTOR_ELT(newDimNames, 1, VECTOR_ELT(dimNames, 0));
387+
Rf_setAttrib(r, R_DimNamesSymbol, newDimNames);
391388
}
392389
return r;
393390
}
@@ -410,16 +407,13 @@ Matrix<INTSXP, StoragePolicy> transpose(const Matrix<INTSXP, StoragePolicy> & x)
410407
}
411408

412409
// there must be a simpler, more C++-ish way for this ...
413-
SEXP rnames = internal::DimNameProxy(x, 0);
414-
SEXP cnames = internal::DimNameProxy(x, 1);
415-
if (!Rf_isNull(rnames) || !Rf_isNull(cnames)) {
416-
SEXP dimnames;
417-
PROTECT(dimnames = Rf_allocVector(VECSXP, 2));
418-
SET_VECTOR_ELT(dimnames, 0, cnames);
419-
SET_VECTOR_ELT(dimnames, 1, rnames);
410+
SEXP dimNames = Rf_getAttrib(x, R_DimNamesSymbol);
411+
if (!Rf_isNull(dimNames)) {
420412
// do we need dimnamesnames ?
421-
Rf_setAttrib(r, R_DimNamesSymbol, dimnames);
422-
UNPROTECT(1); /* dimnames */
413+
Shield<SEXP> newDimNames(Rf_allocVector(VECSXP, 2));
414+
SET_VECTOR_ELT(newDimNames, 0, VECTOR_ELT(dimNames, 1));
415+
SET_VECTOR_ELT(newDimNames, 1, VECTOR_ELT(dimNames, 0));
416+
Rf_setAttrib(r, R_DimNamesSymbol, newDimNames);
423417
}
424418
return r;
425419
}
@@ -442,16 +436,13 @@ Matrix<STRSXP, StoragePolicy> transpose(const Matrix<STRSXP, StoragePolicy> & x)
442436
}
443437

444438
// there must be a simpler, more C++-ish way for this ...
445-
SEXP rnames = internal::DimNameProxy(x, 0);
446-
SEXP cnames = internal::DimNameProxy(x, 1);
447-
if (!Rf_isNull(rnames) || !Rf_isNull(cnames)) {
448-
SEXP dimnames;
449-
PROTECT(dimnames = Rf_allocVector(VECSXP, 2));
450-
SET_VECTOR_ELT(dimnames, 0, cnames);
451-
SET_VECTOR_ELT(dimnames, 1, rnames);
439+
SEXP dimNames = Rf_getAttrib(x, R_DimNamesSymbol);
440+
if (!Rf_isNull(dimNames)) {
452441
// do we need dimnamesnames ?
453-
Rf_setAttrib(r, R_DimNamesSymbol, dimnames);
454-
UNPROTECT(1); /* dimnames */
442+
Shield<SEXP> newDimNames(Rf_allocVector(VECSXP, 2));
443+
SET_VECTOR_ELT(newDimNames, 0, VECTOR_ELT(dimNames, 1));
444+
SET_VECTOR_ELT(newDimNames, 1, VECTOR_ELT(dimNames, 0));
445+
Rf_setAttrib(r, R_DimNamesSymbol, newDimNames);
455446
}
456447
return r;
457448
}

0 commit comments

Comments
 (0)