@@ -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