11/*
22 * R : A Computer Language for Statistical Data Analysis
3- * Copyright (C) 2000--2024 The R Core Team
3+ * Copyright (C) 2000--2025 The R Core Team
44 * Copyright (C) 2001--2012 The R Foundation
55 * Copyright (C) 1995, 1996 Robert Gentleman and Ross Ihaka
66 *
@@ -409,7 +409,7 @@ void printArray(SEXP x, SEXP dim, int quote, int right, SEXP dimnames)
409409 else { /* ndim >= 3 */
410410 SEXP dn , dnn , dn0 , dn1 ;
411411 const int * dims = INTEGER_RO (dim );
412- int i , j , nb , nb_pr , nr_last ,
412+ int i , j , nb , nb_pr , ne_last , nc_last , nr_last ,
413413 nr = dims [0 ], nc = dims [1 ],
414414 b = nr * nc ;
415415 Rboolean max_reached , has_dimnames = (dimnames != R_NilValue ),
@@ -443,16 +443,21 @@ void printArray(SEXP x, SEXP dim, int quote, int right, SEXP dimnames)
443443 nb_pr = ceil_DIV (R_print .max , b );
444444 /* for the last, (nb_pr)th matrix slice, use only nr_last rows;
445445 * using floor(), not ceil(), since 'nc' could be huge: */
446- nr_last = (R_print .max - b * (nb_pr - 1 )) / nc ;
447- if (nr_last == 0 ) { nb_pr -- ; nr_last = nr ; }
446+ ne_last = R_print .max - b * (nb_pr - 1 );
447+ nc_last = (ne_last < nc ) ? 0 : nc ;
448+ nr_last = (ne_last < nc ) ? 0 : ne_last / nc ;
449+ if (nr_last == 0 ) { nb_pr -- ; nc_last = nc ; nr_last = nr ;}
448450 } else {
449451 nb_pr = (nb > 0 ) ? nb : 1 ; // do print *something* when dim = c(a,b,0)
452+ ne_last = b ;
453+ nc_last = nc ;
450454 nr_last = nr ;
451455 }
452456 for (i = 0 ; i < nb_pr ; i ++ ) {
453457 Rboolean do_ij = nb > 0 ,
454458 i_last = (i == nb_pr - 1 ); /* for the last slice */
455- int use_nr = i_last ? nr_last : nr ;
459+ int use_nc = i_last ? nc_last : nc ,
460+ use_nr = i_last ? nr_last : nr ;
456461 if (do_ij ) {
457462 int k = 1 ;
458463 Rprintf (", " );
@@ -478,36 +483,44 @@ void printArray(SEXP x, SEXP dim, int quote, int right, SEXP dimnames)
478483 }
479484 switch (TYPEOF (x )) {
480485 case LGLSXP :
481- printLogicalMatrix (x , i * b , use_nr , nr , nc , dn0 , dn1 , rn , cn , do_ij );
486+ printLogicalMatrix (x , i * b , use_nr , nr , use_nc , dn0 , dn1 , rn , cn , do_ij );
482487 break ;
483488 case INTSXP :
484- printIntegerMatrix (x , i * b , use_nr , nr , nc , dn0 , dn1 , rn , cn , do_ij );
489+ printIntegerMatrix (x , i * b , use_nr , nr , use_nc , dn0 , dn1 , rn , cn , do_ij );
485490 break ;
486491 case REALSXP :
487- printRealMatrix (x , i * b , use_nr , nr , nc , dn0 , dn1 , rn , cn , do_ij );
492+ printRealMatrix (x , i * b , use_nr , nr , use_nc , dn0 , dn1 , rn , cn , do_ij );
488493 break ;
489494 case CPLXSXP :
490- printComplexMatrix (x , i * b , use_nr , nr , nc , dn0 , dn1 , rn , cn , do_ij );
495+ printComplexMatrix (x , i * b , use_nr , nr , use_nc , dn0 , dn1 , rn , cn , do_ij );
491496 break ;
492497 case STRSXP :
493498 if (quote ) quote = '"' ;
494- printStringMatrix (x , i * b , use_nr , nr , nc ,
499+ printStringMatrix (x , i * b , use_nr , nr , use_nc ,
495500 quote , right , dn0 , dn1 , rn , cn , do_ij );
496501 break ;
497502 case RAWSXP :
498- printRawMatrix (x , i * b , use_nr , nr , nc , dn0 , dn1 , rn , cn , do_ij );
503+ printRawMatrix (x , i * b , use_nr , nr , use_nc , dn0 , dn1 , rn , cn , do_ij );
499504 break ;
500505 }
501506 Rprintf ("\n" );
502507 }
503508
504- if (max_reached && nb_pr < nb ) {
509+ if (max_reached ) {
505510 Rprintf (" [ reached 'max' / getOption(\"max.print\") -- omitted" );
506- if (nr_last < nr ) Rprintf (" %d row(s) and" , nr - nr_last );
507- Rprintf (" %d matrix slice(s) ]\n" , nb - nb_pr );
511+ if (nb_pr < nb )
512+ Rprintf (ngettext (" %d slice" , " %d slices" , nb - nb_pr ), nb - nb_pr );
513+ else if (nb_pr == nb ) {
514+ if (nr_last < nr ) Rprintf (ngettext (" %d row" , " %d rows" , nr - nr_last ), nr - nr_last );
515+ if (nc_last < nc ) Rprintf (ngettext (" %d column" , " %d columns" , nc - nc_last ), nc - nc_last );
516+ /* == MM: replace the above with
517+ if((nr -= nr_last) > 0) Rprintf(ngettext(" %d row", " %d rows", nr), nr);
518+ if((nc -= nc_last) > 0) Rprintf(ngettext(" %d column", " %d columns", nc), nc);
519+ */
520+ }
521+ Rprintf (" ] \n" );
508522 }
509523 }
510524 UNPROTECT (nprotect );
511525 vmaxset (vmax );
512526}
513-
0 commit comments