This is what I would do, for example, with s=1:2 :
1) Imagine the subsets with a 0/1 matrix for each element.
subsets = as.matrix(do.call(expand.grid,replicate(length(s),0:1,simplify=FALSE)))
which gives
Var1 Var2 [1,] 0 0 [2,] 1 0 [3,] 0 1 [4,] 1 1
Here, the first line is an empty subset; the second, {1}; third, {2}; and fourth, {1,2}. To get a subset, use mysubset = s[subsets[row,]] , where row is the row of the desired subset.
2) Represent pairs of subsets as pairs of rows of a matrix:
pairs <- expand.grid(Row1=1:nrow(subsets),Row2=1:nrow(subsets))
which gives
Row1 Row2 1 1 1 2 2 1 3 3 1 4 4 1 5 1 2 6 2 2 7 3 2 8 4 2 9 1 3 10 2 3 11 3 3 12 4 3 13 1 4 14 2 4 15 3 4 16 4 4
Here, the fourteenth line corresponds to the second and fourth lines of subsets , therefore {1} and {1,2}. This implies an order of paired questions (which implicitly assumes a Cartesian product). To restore the subsets, use mypairosubsets=lapply(pairs[p,],function(r) s[subsets[r,]]) , where p is the string of the pair you want.
The expansion outside the pair in the case of P(s)^n (where P(s) is the set of cardinality s ) will look like
setsosets = as.matrix(do.call(expand.grid,replicate(n,1:nrow(subsets),simplify=FALSE)))
Here, each line will have a vector of numbers. Each number corresponds to a row in the subsets matrix.
Creating instances of s elements is probably not necessary for what you do after that. However, you can do it here using lapply(1:nrow(pairs),function(p)lapply(pairs[p,],function(r) s[subsets[r,]])) , which starts as ...
[[1]] [[1]]$Row1 integer(0) [[1]]$Row2 integer(0) [[2]] [[2]]$Row1 [1] 1 [[2]]$Row2 integer(0)