@@ -378,16 +378,13 @@ Matrix<REALSXP, StoragePolicy> transpose(const Matrix<REALSXP, StoragePolicy> &
378
378
}
379
379
380
380
// 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)) {
388
383
// 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);
391
388
}
392
389
return r;
393
390
}
@@ -410,16 +407,13 @@ Matrix<INTSXP, StoragePolicy> transpose(const Matrix<INTSXP, StoragePolicy> & x)
410
407
}
411
408
412
409
// 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)) {
420
412
// 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);
423
417
}
424
418
return r;
425
419
}
@@ -442,16 +436,13 @@ Matrix<STRSXP, StoragePolicy> transpose(const Matrix<STRSXP, StoragePolicy> & x)
442
436
}
443
437
444
438
// 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)) {
452
441
// 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);
455
446
}
456
447
return r;
457
448
}
0 commit comments