Предполагается, что вопрос заключается в том, как создать объект call
, функция которого является первым аргументом params
, имя единственного аргумента которого является значением второго компонента params
, а значением аргумента является третий компонент из params
тогда c2
является этим объектом вызова. Мы проверяем, что созданный объект cakl идентичен объекту вызова rlang, показанному в вопросе.
c2 <- as.call(setNames(params, c("", "", params2$my_name))[-2])
# verify that c2 equals the output of the rlang example in question
c1 <- with(expr = rlang::call2(my_fun, !!my_name := my_value), data = params)
identical(c1, c2)
## [1] TRUE
Это обобщает так, что если у вызова есть больше аргументов, так что params имеет длину n + 2 и второй компонент из params
- это вектор имен, длина которого равна n, тогда он все еще работает.
Если у вас есть контроль над вводом, я думаю, что было бы более целесообразно определить список ввода как имеющий один компонент для функции name и один компонент для каждого аргумента, а имена компонентов являются именами аргументов (в отличие от отдельного аргумента для хранения имен). В этом случае мы могли бы просто написать следующее. На самом деле то, что сделано выше, это преобразование параметров в эту форму, а затем использование as.call, чтобы мы могли также предоставить эту форму с самого начала, если это возможно.
as.call(params2) # params2[[1]] is func name, params2[-1] is named args
Примечание
Для выполнения вызов просто использовать:
eval(c2)
или мы могли бы использовать do.call
:
do.call(as.character(params[[1]]), setNames(tail(params, -2), params[[2]]))