如何在函数中向“公式”类型的对象添加(例如向量名称)?

时间:2011-12-15 01:01:33

标签: class r formula

这是我想要做的非常精简的版本,我无法粘贴我的确切问题,因为代码太长而且复杂,但我认为这是问题的根源。感谢Josh对这个问题的回答How do you code an R function so that it 'knows' to look in 'data' for the variables in other arguments?我已经在那里了。

example <- function(model, xvar3=NULL, xvar4=NULL, data){
    print(class(model))
    #xvar3 <- eval(substitute(xvar3), envir=data, enclos=parent.frame())
    #xvar4 <- eval(substitute(xvar4), envir=data, enclos=parent.frame())
    print(class(xvar3))
    xvar5 <- xvar4^2
    mod <- glm( model + xvar3 + xvar5, data=data)    
    return(mod)
}

example(mpg ~ cyl, hp, wt, data=mtcars)

这失败了。如果你删除评论(基于前一个问题的帮助),它解决了'发现'hp和wt的问题。 'model'是类公式,我希望它成为'mpg~cyl + xvar3 + xvar5',以便glm运行。但我似乎无法将它们添加到公式中。

我一直在玩'调用'类,进一步使用'eval'和'as.formula',其中包含'paste'和'noquote'等等,但却无法让它坚持下去。 / p>

3 个答案:

答案 0 :(得分:2)

这是一种方式。我使用的技巧是根据给定的一个+两个额外的变量创建一个新的公式。然后我用公式的环境做了一个技巧,这样就可以使用xvar3 / xvar5和调用者本地的任何变量。

glm将始终查看公式的环境和变量的数据(以及其他地方!)。这就是为什么在这种情况下必须对公式环境进行操作:它包含xvar3xvar5,并且父环境设置为原始公式的环境,以便还搜索变量({{ 1}}在最后一个例子中)...

foo

答案 1 :(得分:1)

我是这样做的:

add_vars <- function(model, xvar3=NULL, xvar4=NULL, data){
  # Capture the unevalated calls to xvar3 and xvar4
  xvar3 <- substitute(xvar3)
  xvar4 <- substitute(xvar4)

  # Use substitute to create the correct formula to supply to update
  update_f <- eval(substitute(. ~ . + xvar3 + I(xvar4 ^ 2), 
    list(xvar3 = xvar3, xvar4 = xvar4)))

  # Modify the original formula string
  update(model, update_f)
}

add_vars(mpg ~ cyl, hp, wt)
# mpg ~ cyl + hp + I(wt^2)

答案 2 :(得分:0)

另一种选择(来自同事):

example <- function(model, xvar3=NULL, xvar4=NULL, data){

    data$xvar3 <- eval(substitute(xvar3), envir=data, enclos=parent.frame())
    data$xvar4 <- eval(substitute(xvar4), envir=data, enclos=parent.frame())
    data$xvar5 <- data$xvar4^2

    model <- as.formula(paste(model[2], paste(model[3], "xvar4","xvar5", sep="+"), sep="~"))
    mod <- glm(model, data=data)
    return(mod)
}

example(mpg ~ cyl, hp, wt, data=mtcars)

我喜欢这个很干净。