【问题标题】:R: convert elements of list into expression from function inputR:将列表的元素从函数输入转换为表达式
【发布时间】:2020-04-13 10:27:42
【问题描述】:

我正在编写一个函数,其中输入是另一个函数的参数和名称。我想将这些参数和函数名转换为未计算的表达式或调用。例如,如果这是对函数的调用:

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= 参数,并将列表元素添加到函数参数中。任何和所有的指针都表示赞赏。谢谢~

【问题讨论】:

    标签: r rlang quasiquotes


    【解决方案1】:

    您可以同时使用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))
    

    【讨论】:

      【解决方案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))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 2011-07-15
        • 2012-02-10
        • 1970-01-01
        • 1970-01-01
        • 2018-07-20
        • 2023-01-05
        相关资源
        最近更新 更多