1. Algoritmo no R:

library(mnormt)
library(ggplot2)
library(gridExtra)

# (C.) Anne Sabourin, 2009
#a ###########################################
T=500 ;p=5 ;r=0.25
X=cur=rnorm(p)
for (t in 1 :T){
  for (j in 1 :p){
    m=sum(cur[-j])/(p-1)
    cur[j]=rnorm(1,(p-1)*r*m/(1+(p-2)*r),
                 sqrt((1+(p-2)*r-(p-1)*r^2)/(1+(p-2)*r)))
  }
  X=cbind(X,cur)
}

# no ggplot

X = X[,-1]
colnames(X) = paste(1:T);
rownames(X) = paste("X", paste(1:p), sep="")

qq = seq(-4,4, len=500)
teorico = dnorm(qq)

X = rbind(X, teorico, qq)

val=as.data.frame(t(X))
dados <- ggplot(data=val)

cores = c("blue", "red", "green", "black")
xx <- list()
for(i in 1:p){
  xx[[i]] <- dados + geom_histogram(aes(x=val[,i], y=..density..), fill=cores[i], alpha=0.5, colour="black") +
    geom_line(aes(x=qq,y=teorico))
}

do.call("grid.arrange", c(xx))

2. Funçao em Rcpp

#include <Rcpp.h>
using namespace Rcpp;

// [[Rcpp::export]]
NumericMatrix funcaoA(int T, int p, double r) {
  
  RNGScope scope;
  NumericMatrix X(T+1,p);
  X(0,_) = rnorm(p);
  NumericVector z;
  double m;
  NumericVector cur;

  for(int i = 0; i < T; i++){
    for(int j = 0; j < p; j++){
      z = X(i,_);
      m = std:: accumulate(z.begin(),z.end(), 0.0) - X(i,j);
      m = m/(p-1);
      cur = rnorm(1,(p-1)*r*m/(1+(p-2)*r),sqrt((1+(p-2)*r-(p-1)*pow(r,2))/(1+(p-2)*r)));
      X(i,j) = cur[0];
    }
  }

//  NumericMatrix X2 = X(Range(0,T-1),Range(0,p-1));
  
  return X;
}
T=500 ;p=5 ;r=0.25
X = funcaoA(T,p,r)
X = t(X)

X = X[,-1]
colnames(X) = paste(1:T);
rownames(X) = paste("X", paste(1:p), sep="")

qq = seq(-4,4, len=500)
teorico = dnorm(qq)

X = rbind(X, teorico, qq)

val=as.data.frame(t(X))
dados <- ggplot(data=val)

cores = c("blue", "red", "green", "black")
xx <- list()
for(i in 1:p){
  xx[[i]] <- dados + geom_histogram(aes(x=val[,i], y=..density..), fill=cores[i], alpha=0.5, colour="black") +
    geom_line(aes(x=qq,y=teorico))
}

do.call("grid.arrange", c(xx))