Как использовать неизвестное количество ключевых столбцов в data.table

Я хочу сделать то же, что объяснилВотдобавление отсутствующих строк в таблицу данных. Единственная дополнительная трудность, с которой я сталкиваюсь, состоит в том, что я хочу, чтобы количество ключевых столбцов, то есть тех строк, которые используются для самосоединения, было гибким.

Вот небольшой пример, который в основном повторяет то, что сделано в ссылке, упомянутой выше:

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]

Что беспокоит меня, так это последняя строчка. я хочуidCols быть гибким (например, если я использую его внутри функции), поэтому я не хочу набиратьunique(df$fundID), unique(df$cfType) вручную. Однако я просто не могу найти обходного пути для этого. Все мои попытки автоматически разделить подмножествоdf в векторы, по мере необходимостиCJ, ошибка с сообщением об ошибкеError in setkeyv(x, cols, verbose = verbose) : Column 'V1' is type 'list' which is not (currently) allowed as a key column type.

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

Я также попытался построить выражение сам:

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))"

Но тогда я не знаю, как использоватьstr, Это все терпит неудачу:

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

Кто-нибудь знает хороший обходной путь?

Ответы на вопрос(2)

Ваш ответ на вопрос