Thankfully, there are some existing solutions:
<br />
library(partitions)<br />
ff = function(x,n){<br />
if(n==1)return(matrix(paste(x,collapse='')))<br />
sp=setparts(restrictedparts(length(unique(x)), n, FALSE));<br />
apply(sp,2,function(z)tapply(x,z,FUN=paste,collapse=''))<br />
}<br />
ff(letters[1:4],2)<br />
ff(letters[1:5],3)<br />
</p>