Cómo usar un número desconocido de columnas clave en una tabla de datos

Quiero hacer lo mismo que explique.aquí, es decir, agregar filas faltantes a una tabla de datos. La única dificultad adicional a la que me enfrento es que quiero que la cantidad de columnas clave, es decir, las filas que se usan para la unión automática, sea flexible.

Aquí hay un pequeño ejemplo que básicamente repite lo que se hace en el enlace mencionado anteriormente:

df <- data.frame(fundID   = rep(letters[1:4], each=6),
                 cfType   = rep(c("D", "D", "T", "T", "R", "R"), times=4),
                 variable = rep(c(1,3), times=12),
                 value    = 1:24)
DT <- as.data.table(df)
idCols <- c("fundID", "cfType")
setkeyv(DT, c(idCols, "variable"))
DT[CJ(unique(df$fundID), unique(df$cfType), seq(from=min(variable), to=max(variable))), nomatch=NA]

Lo que me molesta es la última línea. quieroidCols ser flexible (por ejemplo, si lo uso dentro de una función), así que no quiero escribirunique(df$fundID), unique(df$cfType) a mano. Sin embargo, simplemente no encuentro ninguna solución para esto. Todos mis intentos de dividir automáticamente el subconjunto dedf en vectores, según sea necesario porCJ, falla con el mensaje de errorError en setkeyv (x, cols, verbose = verbose): la columna 'V1' es el tipo 'lista' que no está permitido (actualmente) como un tipo de columna clave.

CJ(sapply(df[, idCols], unique))
CJ(unique(df[, idCols]))
CJ(as.vector(unique(df[, idCols])))
CJ(unique(DT[, idCols, with=FALSE]))

También intenté construir la expresión yo mismo:

str <- ""
for (i in idCols) {
  str <- paste0(str, "unique(df$", i, "), ")
}
str <- paste0(str, "seq(from=min(variable), to=max(variable))")
str
[1] "unique(df$fundID), unique(df$cfType), seq(from=min(variable), to=max(variable))"

Pero entonces no sé cómo usarstr. Todo esto falla:

CJ(eval(str))
CJ(substitute(str))
CJ(call(str))

¿Alguien sabe una buena solución?

Respuestas a la pregunta(2)

Su respuesta a la pregunta