回复 第2楼 的 lyxmoo:
<br />
SEXP dswap(SEXP a, SEXP b) {<br />
PROTECT(a=AS_NUMERIC(a));<br />
PROTECT(b=AS_NUMERIC(b));<br />
double * pA = REAL(a), * pB = REAL(b);<br />
int *dimA = INTEGER(GET_DIM(a)),*dimB = INTEGER(GET_DIM(b));<br />
int nA = length(a), nB = length(b),rowA=dimA[0],colA=dimA[1],rowB=dimB[0],colB=dimB[1];<br />
if(nA != nB)<br />
error("The length of the two vectors are inconsistent");</p>
<p> SEXP list,list_names;<br />
char *names[2]={"a","b"};<br />
PROTECT(list_names=allocVector(STRSXP,2));<br />
for(int i=0;i<2;i++)<br />
SET_STRING_ELT(list_names,i,mkChar(names[i]));<br />
PROTECT(list=allocVector(VECSXP,2));</p>
<p> const int iOne = 1;</p>
<p> F77_CALL(dswap)(&nA,pA,&iOne,pB,&iOne);<br />
/*<br />
for(int i=0;i<nA;i++) {<br />
// Rprintf("%f",pA[i]);<br />
REAL(a)[i]=pA[i];<br />
REAL(b)[i]=pB[i];<br />
}<br />
*/<br />
SET_VECTOR_ELT(list,0,a);<br />
SET_VECTOR_ELT(list,1,b);<br />
setAttrib(list,R_NamesSymbol,list_names);<br />
UNPROTECT(4);<br />
return list;<br />
}<br />
完整的函数是上面的,调用F77的dswap,奇怪的是如果传进的参数类似m<-matrix(c(1:4),1)则不会改变实际参数,其他的则实际参数会调换(m<-matrix(c(1.1:4.1),1)或m<-matrix(runif(4),1))。
</p>