【问题标题】:How to quote/unquote variables for constructing formulas in R [duplicate]如何引用/取消引用变量以在 R 中构造公式 [重复]
【发布时间】:2021-06-01 06:06:23
【问题描述】:

我很难理解引用、取消引用、准引用...在 R 中是如何工作的。 在这种情况下,我想拟合一个线性模型。我认为通常你不需要引用lm-call 的输入。

所以我想做这样的事情:

names(mtcars)

y = "mpg" # response
x = "hp" # predictor

fml = y ~ x

lm(fml, data=mtcars)

但显然这不起作用,因为字面上的“y”和“x”是在公式中传递的。我用expr()eval() 尝试了几件事,但我认为我的方法不对。阅读高级 R 中的元编程章节肯定会有很大帮助,但也许这里还有一个“直观”的解决方案。

【问题讨论】:

  • y = as.name("mpg"); x = as.name("hp"); fml = eval(bquote(.(y) ~ .(x))) 但是,通常最好替换为lm 调用,例如eval(bquote(lm(.(y) ~ .(x)))),否则您可能会遇到范围界定问题,因为错误的环境可能与公式相关联。

标签: r metaprogramming quoting


【解决方案1】:

对于lm,您不需要引用/取消引用。您可以使用as.formulareformulate 来构造公式。

lm(reformulate(y, x), data=mtcars)

但是,由于lm 也接受可以强制转换为公式的字符串,因此您可以使用paste,它会给出相同的结果。

lm(paste(x, y, sep = '~'), data=mtcars)

【讨论】:

    【解决方案2】:

    如果你想使用rlang 风格的引用/取消引用,你会使用。

    y = sym("mpg")
    x = sym("hp")
    
    # alternatively
    # y = expr(mpg)
    # x = expr(hp)
    
    
    fml = inject(!!y ~ !!x)
    
    lm(fml, data=mtcars)
    

    【讨论】:

    • 哇,非常感谢!
    猜你喜欢
    • 2015-01-25
    • 2021-12-14
    • 1970-01-01
    • 2011-04-15
    • 2013-05-04
    • 2013-11-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多