This will be one chain with two calls to resources , one of which will be reinstalled behind the scenes.
library(data.table) samples <- data.table(name = letters[1:3], primary = c(17, 0, 18), secondary = c(55, 42, 42)) resources <- data.table(primary = 17:19, secondary = c(42, NA, 43), info = LETTERS[9:11]) setkey(samples, primary) setkey(resources, primary) samples[resources, info := i.info ][, .(name, info),, secondary ][resources[, info,, secondary], info := ifelse(is.na(info), i.info, info) ][, secondary := NULL]
As you ask for more complex examples. It is worth noting that data.table queries can be easily managed in the form of modules, having prepared interrogation arguments in advance. They can later be easily conditionally managed. An example is below.
lkp2 <- quote(resources[, info,, secondary]) lkp2_formula <- quote(info := ifelse(is.na(info), i.info, info)) setkey(samples, primary) samples[resources, info := i.info ][, .(name, info),, secondary ][eval(lkp2), eval(lkp2_formula) ][, secondary := NULL]
If you rely heavily on .table data chain processes, you may find the dtq package useful.