Вот пример функции сплайсинга
splice <- function(x, replacements) {
if (is(x, "call")) {
as.call(do.call("c",lapply(as.list(x), splice, replacements), quote=T))
} else if (is(x, "name")) {
if (deparse(x) %in% names(replacements)) {
return(replacements[[deparse(x)]])
} else {
list(x)
}
} else {
list(x)
}
}
Кажется, что она работает с образцом ввода
splice(quote(f(x, 5) ), list(x=list(a = 1, b = quote(sym), c = "char" )))
# f(a = 1, b = sym, c = "char", 5)
splice(quote(g(f(h(y)), z)) , list(y=list(1,2,3)))
# g(f(h(1, 2, 3)), z)
splice(quote(g(f(h(y), z), z)), list(z=list(4, quote(x))) )
# g(f(h(y), 4, x), 4, x)
В основном вы просто меняете имена символов.он также должен работать с заменами одной переменной, которых нет в списке.
splice(quote(f(x,5)), list(x=7))
# f(7, 5)
В основном вам нужно переписать вызов, управляя им как списком.Это то, что функции Tidyverse делают за сценой.Они перехватывают текущий вызов, переписывают его, затем оценивают вновь расширенный вызов.substitute
никогда не будет работать, потому что вы не просто заменяете один символ одним значением.Вам необходимо изменить количество параметров, передаваемых функции.