R: преобразовать элементы списка в выражение из ввода функции

Я пишу функцию, где входными данными являются аргументы и имя другой функции. Я хотел бы преобразовать эти аргументы и имя функции в неоцененное выражение или вызов. Например, если это вызов функции:

huh_fun(
  data = mtcars
  method = lm,
  formula = hp ~ mpg,
  method.args = list(weights = drat, subset = rep(TRUE, 32)) # list of additional arguments
)

Я хотел бы, чтобы функция возвращала следующее выражение/вызов без оценки:

lm(hp ~ mpg, data = mtcars, weights = drat, subset = rep(TRUE, 32))

Мне удалось процитировать аргументы data=, method= и formula= и объединить их в вызов. Но не могу понять, как указать аргумент method.args= и добавить элементы списка в аргументы функции. Любые указатели приветствуются. Спасибо~


person Daniel D. Sjoberg    schedule 21.12.2019    source источник


Ответы (2)


Имея фиксированные имена аргументов в «huh_fun», мы могли бы сконструировать вызов без оценки, используя объекты «язык»:

huh_fun = function(data, method, formula, method.args)
{
    ans = c(list(substitute(method), 
                 substitute(formula), 
                 data = substitute(data)), 
            as.list(substitute(method.args))[-1])
    as.call(ans)
}

huh_fun(
    data = mtcars,
    method = lm,
    formula = hp ~ mpg,
    method.args = list(weights = drat, subset = rep(TRUE, 32)))
#lm(hp ~ mpg, data = mtcars, weights = drat, subset = rep(TRUE, 
#    32))
person alexis_laz    schedule 21.12.2019

Вы можете использовать deparse(substitute(x)) и paste вместе. Создайте вызов с помощью str2lang.

huh_fun <- function(data, method, formula, method.args) {
  str2lang(paste0(deparse(substitute(method)), "(", deparse(substitute(formula)), ", ",
         "data = ", deparse(substitute(data)), ", ", 
         gsub("list\\((.*)\\)$", "\\1", deparse(substitute(method.args))),
         ")"))
}

Результат

huh_fun(
  data=mtcars,
  method=lm,
  formula=hp ~ mpg,
  method.args=list(weights=drat, subset=rep(TRUE, 32)) # list of additional arguments
)

# lm(hp ~ mpg, data = mtcars, weights = drat, subset = rep(TRUE, 32))
person jay.sf    schedule 21.12.2019