The R Project SVN R

Rev

Rev 1839 | Rev 1881 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1839 Rev 1858
Line 32... Line 32...
32
    if (TYPEOF(dimnames) == VECSXP)
32
    if (TYPEOF(dimnames) == VECSXP)
33
	return VECTOR(dimnames)[0];
33
	return VECTOR(dimnames)[0];
34
    else if (TYPEOF(dimnames) == LISTSXP)
34
    else if (TYPEOF(dimnames) == LISTSXP)
35
	return CAR(dimnames);
35
	return CAR(dimnames);
36
    else
36
    else
37
	return R_NilValue;	     
37
	return R_NilValue;
38
}
38
}	     
39
 
39
 
40
SEXP GetColNames(SEXP dimnames)
40
SEXP GetColNames(SEXP dimnames)
41
{
41
{
42
    if (TYPEOF(dimnames) == VECSXP)
42
    if (TYPEOF(dimnames) == VECSXP)
43
	return VECTOR(dimnames)[1];
43
	return VECTOR(dimnames)[1];
Line 194... Line 194...
194
    }
194
    }
195
    else {
195
    else {
196
	/* We have a lower dimensional array. */
196
	/* We have a lower dimensional array. */
197
	SEXP newdims, newdimnames;
197
	SEXP newdims, newdimnames;
198
	int j = 0;
198
	int j = 0;
199
	n = 0;
-
 
200
	PROTECT(newdims = allocVector(INTSXP, n));
199
	PROTECT(newdims = allocVector(INTSXP, n));
201
	for (i = 0; i < ndims; i++)
200
	for (i = 0, n = 0; i < ndims; i++)
202
	    if (INTEGER(dims)[i] != 1)
201
	    if (INTEGER(dims)[i] != 1)
203
		INTEGER(newdims)[n++] = INTEGER(dims)[i];
202
		INTEGER(newdims)[n++] = INTEGER(dims)[i];
204
	if (TYPEOF(dimnames) == VECSXP) {
203
	if (dimnames != R_NilValue) {
205
	    PROTECT(newdimnames = allocVector(VECSXP, n));
204
	    int havenames = 0;
206
	    for (i = 0; i < ndims; i++) {
205
	    for (i = 0; i < ndims; i++)
207
		if (INTEGER(dims)[i] != 1)
-
 
208
		    VECTOR(newdimnames)[j++] = VECTOR(dimnames)[i];
206
		if (INTEGER(dims)[i] != 1 && VECTOR(dimnames)[i] != R_NilValue)
209
	    }
207
		    havenames = 1;
210
	}
-
 
211
	else if (TYPEOF(dimnames) == LISTSXP) {
208
	    if (havenames) {
212
	    PROTECT(newdimnames = allocVector(VECSXP, n));
209
		newdimnames = allocVector(VECSXP, n);
213
	    q = dimnames;	    
-
 
214
	    for (i = 0; i < ndims; i++) {
210
		for (i = 0, n= 0; i < ndims; i++) {
215
		if (INTEGER(dims)[i] != 1)
211
		    if (INTEGER(dims)[i] != 1)
216
		    VECTOR(newdimnames)[j++] = CAR(q);
212
			VECTOR(newdimnames)[n++] = VECTOR(dimnames)[i];
217
		q = CDR(q);
213
		}
218
	    }
214
	    }
-
 
215
	    else dimnames = R_NilValue;
219
	}
216
	}
220
	else
-
 
221
	    newdimnames = R_NilValue;
217
	PROTECT(dimnames);
222
	setAttrib(x, R_DimNamesSymbol, R_NilValue);
218
	setAttrib(x, R_DimNamesSymbol, R_NilValue);
223
	setAttrib(x, R_DimSymbol, newdims);
219
	setAttrib(x, R_DimSymbol, newdims);
224
	if (dimnames != R_NilValue) {
220
	if (dimnames != R_NilValue) {
225
	    setAttrib(x, R_DimNamesSymbol, newdimnames);
221
	    setAttrib(x, R_DimNamesSymbol, newdimnames);
226
	    UNPROTECT(1);
-
 
227
	}
222
	}
228
	UNPROTECT(1);
223
	UNPROTECT(2);
229
    }
224
    }
230
    UNPROTECT(1);
225
    UNPROTECT(1);
231
    return x;
226
    return x;
232
}
227
}
233
 
228
 
Line 531... Line 526...
531
	    matprod(REAL(CAR(args)), nrx, ncx,
526
	    matprod(REAL(CAR(args)), nrx, ncx,
532
		    REAL(CADR(args)), nry, ncy, REAL(ans));
527
		    REAL(CADR(args)), nry, ncy, REAL(ans));
533
	PROTECT(xdims = getAttrib(CAR(args), R_DimNamesSymbol));
528
	PROTECT(xdims = getAttrib(CAR(args), R_DimNamesSymbol));
534
	PROTECT(ydims = getAttrib(CADR(args), R_DimNamesSymbol));
529
	PROTECT(ydims = getAttrib(CADR(args), R_DimNamesSymbol));
535
	if (xdims != R_NilValue || ydims != R_NilValue) {
530
	if (xdims != R_NilValue || ydims != R_NilValue) {
-
 
531
#ifdef NEWLIST
-
 
532
	    SEXP dimnames = allocVector(VECSXP, 2);
-
 
533
	    if (xdims != R_NilValue)
-
 
534
		VECTOR(dimnames)[0] = VECTOR(xdims)[0];
-
 
535
	    if (ydims != R_NilValue)
-
 
536
		VECTOR(dimnames)[1] = VECTOR(ydims)[1];
-
 
537
	    setAttrib(ans, R_DimNamesSymbol, dimnames);
-
 
538
#else
536
	    setAttrib(ans, R_DimNamesSymbol, list2(CAR(xdims), CADR(ydims)));
539
	    setAttrib(ans, R_DimNamesSymbol, list2(CAR(xdims), CADR(ydims)));
-
 
540
#endif
537
	}
541
	}
538
    }
542
    }
539
    else {
543
    else {
540
	PROTECT(ans = allocMatrix(mode, ncx, ncy));
544
	PROTECT(ans = allocMatrix(mode, ncx, ncy));
541
	if (mode == CPLXSXP)
545
	if (mode == CPLXSXP)
Line 545... Line 549...
545
	    crossprod(REAL(CAR(args)), nrx, ncx,
549
	    crossprod(REAL(CAR(args)), nrx, ncx,
546
		      REAL(CADR(args)), nry, ncy, REAL(ans));
550
		      REAL(CADR(args)), nry, ncy, REAL(ans));
547
	PROTECT(xdims = getAttrib(CAR(args), R_DimNamesSymbol));
551
	PROTECT(xdims = getAttrib(CAR(args), R_DimNamesSymbol));
548
	PROTECT(ydims = getAttrib(CADR(args), R_DimNamesSymbol));
552
	PROTECT(ydims = getAttrib(CADR(args), R_DimNamesSymbol));
549
	if (xdims != R_NilValue || ydims != R_NilValue) {
553
	if (xdims != R_NilValue || ydims != R_NilValue) {
-
 
554
#ifdef NEWLIST
-
 
555
	    SEXP dimnames = allocVector(VECSXP, 2);
-
 
556
	    if (xdims != R_NilValue)
-
 
557
		VECTOR(dimnames)[0] = VECTOR(xdims)[1];
-
 
558
	    if (ydims != R_NilValue)
-
 
559
		VECTOR(dimnames)[1] = VECTOR(ydims)[1];
-
 
560
	    setAttrib(ans, R_DimNamesSymbol, dimnames);
-
 
561
#else
550
	    setAttrib(ans, R_DimNamesSymbol, list2(CADR(xdims), CADR(ydims)));
562
	    setAttrib(ans, R_DimNamesSymbol, list2(CADR(xdims), CADR(ydims)));
-
 
563
#endif
551
	}
564
	}
552
    }
565
    }
553
    UNPROTECT(3);
566
    UNPROTECT(3);
554
    return ans;
567
    return ans;
555
}
568
}
556
 
569
 
557
SEXP do_transpose(SEXP call, SEXP op, SEXP args, SEXP rho)
570
SEXP do_transpose(SEXP call, SEXP op, SEXP args, SEXP rho)
558
{
571
{
559
    SEXP a, r, dims, dn;
572
    SEXP a, r, dims, dimnames, rnames, cnames;
560
    int i, len = 0, ncol=0, nrow=0;
573
    int i, len = 0, ncol=0, nrow=0;
561
 
574
 
562
    checkArity(op, args);
575
    checkArity(op, args);
563
    a = CAR(args);
576
    a = CAR(args);
564
 
577
 
565
    if (isVector(a)) {
578
    if (isVector(a)) {
566
	dims = getAttrib(a, R_DimSymbol);
579
	dims = getAttrib(a, R_DimSymbol);
-
 
580
	rnames = R_NilValue;
-
 
581
	cnames = R_NilValue;
567
	switch(length(dims)) {
582
	switch(length(dims)) {
568
	case 0:
583
	case 0:
-
 
584
	    nrow = len = length(a);
-
 
585
	    ncol = 1;
-
 
586
	    rnames = getAttrib(a, R_NamesSymbol);
-
 
587
	    break;
569
	case 1:
588
	case 1:
570
	    nrow = len = length(a);
589
	    nrow = len = length(a);
571
	    ncol = 1;
590
	    ncol = 1;
-
 
591
	    rnames = getAttrib(a, R_DimNamesSymbol);
-
 
592
	    if (rnames != R_NilValue)
-
 
593
		rnames = VECTOR(rnames)[0];
572
	    break;
594
	    break;
573
	case 2:
595
	case 2:
574
	    ncol = ncols(a);
596
	    ncol = ncols(a);
575
	    nrow = nrows(a);
597
	    nrow = nrows(a);
576
	    len = length(a);
598
	    len = length(a);
-
 
599
	    dimnames = getAttrib(a, R_DimNamesSymbol);
-
 
600
	    if (dimnames != R_NilValue) {
-
 
601
		rnames = VECTOR(dimnames)[0];
-
 
602
		cnames = VECTOR(dimnames)[1];
-
 
603
	    }
577
	    break;
604
	    break;
578
	default:
605
	default:
579
	    goto not_matrix;
606
	    goto not_matrix;
580
	}
607
	}
581
    }
608
    }
582
    else if (isList(a)) {
-
 
583
	dims = getAttrib(a, R_DimSymbol);
-
 
584
	if (length(dims) == 2) {
-
 
585
	    errorcall(call, "can't transpose list matrices (yet)\n");
-
 
586
	}
-
 
587
	else goto not_matrix;
-
 
588
    }
609
    else
589
    else goto not_matrix;
610
	goto not_matrix;
590
 
-
 
591
    PROTECT(r = allocVector(TYPEOF(a), len));
611
    PROTECT(r = allocVector(TYPEOF(a), len));
592
 
-
 
593
    switch (TYPEOF(a)) {
612
    switch (TYPEOF(a)) {
594
    case LGLSXP:
613
    case LGLSXP:
595
    case INTSXP:
614
    case INTSXP:
596
	for (i = 0; i < len; i++)
615
	for (i = 0; i < len; i++)
597
	    INTEGER(r)[i] = INTEGER(a)[(i / ncol) + (i % ncol) * nrow];
616
	    INTEGER(r)[i] = INTEGER(a)[(i / ncol) + (i % ncol) * nrow];
Line 606... Line 625...
606
	break;
625
	break;
607
    case STRSXP:
626
    case STRSXP:
608
	for (i = 0; i < len; i++)
627
	for (i = 0; i < len; i++)
609
	    STRING(r)[i] = STRING(a)[(i / ncol) + (i % ncol) * nrow];
628
	    STRING(r)[i] = STRING(a)[(i / ncol) + (i % ncol) * nrow];
610
	break;
629
	break;
-
 
630
    case VECSXP:
-
 
631
	for (i = 0; i < len; i++)
-
 
632
	    VECTOR(r)[i] = VECTOR(a)[(i / ncol) + (i % ncol) * nrow];
-
 
633
	break;
-
 
634
    default:
-
 
635
	goto not_matrix;
611
    }
636
    }
612
    dims = allocVector(INTSXP, 2);
637
    PROTECT(dims = allocVector(INTSXP, 2));
613
    INTEGER(dims)[0] = ncol;
638
    INTEGER(dims)[0] = ncol;
614
    INTEGER(dims)[1] = nrow;
639
    INTEGER(dims)[1] = nrow;
615
    setAttrib(r, R_DimSymbol, dims);
640
    setAttrib(r, R_DimSymbol, dims);
616
 
-
 
617
    if (!isNull(dn = getAttrib(a, R_DimNamesSymbol))) {
-
 
618
	PROTECT(dn = duplicate(dn));
-
 
619
	switch(length(dn)) {
-
 
620
	case 1:
-
 
621
	    PROTECT(dims = allocList(2));
-
 
622
	    CADR(dims) = CAR(dn);
-
 
623
	    setAttrib(r, R_DimNamesSymbol, dims);
-
 
624
	    UNPROTECT(1);
641
    UNPROTECT(1);
625
	    break;
642
    if(rnames != R_NilValue || cnames != R_NilValue) {
626
	case 2:
-
 
627
	    dims = CAR(dn);
643
	PROTECT(dimnames = allocVector(VECSXP, 2));
628
	    CAR(dn) = CADR(dn);
644
	VECTOR(dimnames)[0] = cnames;
629
	    CADR(dn) = dims;
645
	VECTOR(dimnames)[1] = rnames;
630
	    setAttrib(r, R_DimNamesSymbol, dn);
646
	setAttrib(r, R_DimNamesSymbol, dimnames);
631
	    break;
-
 
632
	}
-
 
633
	UNPROTECT(1);
647
	UNPROTECT(1);
634
    }
648
    }
635
 
-
 
-
 
649
    copyMostAttrib(a, r);
636
    UNPROTECT(1);
650
    UNPROTECT(1);
637
    return r;
651
    return r;
638
 
-
 
639
 not_matrix:
652
 not_matrix:
640
    errorcall(call, "argument is not a matrix\n");
653
    errorcall(call, "argument is not a matrix\n");
641
    return call;/* never used; just for -Wall */
654
    return call;/* never used; just for -Wall */
642
}
655
}
643
 
656