Jak użyć nieznanej liczby kolumn klucza w tabeli danych

Chcę zrobić to samo, co wyjaśnionotutaj, tj. dodawanie brakujących wierszy do tabeli danych. Jedyną dodatkową trudnością, z którą się zmagam, jest to, że chcę, aby liczba kluczowych kolumn, tj. Tych wierszy, które są używane do samodzielnego łączenia, była elastyczna.

Oto mały przykład, który w zasadzie powtarza to, co zostało zrobione w powyższym linku:

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]

Martwi mnie ostatnia linia. chcęidCols być elastycznym (na przykład jeśli używam go w funkcji), więc nie chcę pisaćunique(df$fundID), unique(df$cfType) ręcznie. Nie znajduję jednak żadnego obejścia tego problemu. Wszystkie moje próby automatycznego podziału podzbiorudf do wektorów, według potrzebCJ, nie powiedzie się z komunikatem o błędzieBłąd w setkeyv (x, cols, verbose = verbose): Kolumna „V1” to typ „lista”, która nie jest (obecnie) dozwolona jako typ kolumny klucza.

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

Sam też próbowałem zbudować wyrażenie:

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

Ale potem nie wiem, jak używaćstr. Wszystko to się nie udaje:

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

Czy ktoś zna dobre obejście?

questionAnswers(2)

yourAnswerToTheQuestion