Algoritmo para calcular el conjunto de potencia (todos los subconjuntos posibles) de un conjunto en R

No pude encontrar una respuesta a esto en ningún lado, así que aquí está mi solución.

La pregunta es: ¿cómo se puede calcular un conjunto de potencias en R?

Es posible hacer esto con la biblioteca "conjuntos", con el comando2^as.set(c(1,2,3,4)), que produce la salida{{}, {1}, {2}, {3}, {4}, {1, 2}, {1, 3}, {1, 4}, {2, 3}, {2, 4}, {3, 4}, {1, 2, 3}, {1, 2, 4}, {1, 3, 4}, {2, 3, 4}, {1, 2, 3, 4}}. Sin embargo, esto utiliza un algoritmo recursivo, que es bastante lento.

Aquí está el algoritmo que se me ocurrió.

Es no recursivo, por lo que es mucho más rápido que algunas de las otras soluciones que existen (y ~ 100 veces más rápido en mi máquina que el algoritmo en el paquete de "conjuntos"). La velocidad sigue siendo O (2 ^ n).

La base conceptual de este algoritmo es la siguiente:

for each element in the set:
    for each subset constructed so far:
        new subset = (subset + element)

Aquí está el código R:

EDIT: aquí hay una versión algo más rápida del mismo concepto; Mi algoritmo original está en el tercer comentario de esta publicación. Este es un 30% más rápido en mi máquina para un conjunto de 19 longitudes.

powerset = function(s){
    len = length(s)
    l = vector(mode="list",length=2^len) ; l[[1]]=numeric()
    counter = 1L
    for(x in 1L:length(s)){
        for(subset in 1L:counter){
            counter=counter+1L
            l[[counter]] = c(l[[subset]],s[x])
        }
    }
    return(l)
}

Esta versión ahorra tiempo al iniciar el vector con su longitud final al inicio y mantener el seguimiento con la variable "contador" de la posición en la que se guardan los nuevos subconjuntos. También es posible calcular la posición analíticamente, pero eso fue un poco más lento.

Respuestas a la pregunta(4)

Su respuesta a la pregunta