I'm only slowly getting versed in rlang, and I think there might be an rlang 'solution' to this situation: I want to call a function with only some of the args coming from a list, the rest being specified in the raw function call. As an example, let's say want to connect to some database with mostly fixed parameters read in by a config file, but varying one final connection param at run-time (e.g. changing the username during interactive use).
params <- list(
drv = RPostgres::Postgres()
,host = "myhost.mydomain.mytld"
,port = 5432
,dbname = "mydbname"
) ## normally read in from some config file
The ugly solution
And now I want to connect as user "user1". One ugly way to do this is:
DBI::dbConnect(params$drv, host = params$host, port = params$port, dbname = params$dbname, user = "user1")
... or the slightly less-verbose:
with(params, DBI::dbConnect(drv, host = host, port = port, dbname = dbname, user = "user1")
The do.call
solution
But usually I just end up using do.call
like so:
do.call(DBI::dbConnect, c(params, user = "user1"))
Is there an rlang solution?
Is there a 'trick' with rlang where I can get the best of both of these worlds? I'm imagining some function (or syntactic sugar) like undots
, that conceptually would fill-in dbConnect
's dots argument with a list's contents, like so:
DBI::dbConnect(undots(params), user = "user1")
I've only just started working with rlang, and I believe I could write a wrapper for dbConnect
to deal with my use case, but I'm hoping there might already be something that I'm just missing here that works for the general case.