这是我想要做的非常精简的版本,我无法粘贴我的确切问题,因为代码太长而且复杂,但我认为这是问题的根源。感谢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>
答案 0 :(得分:2)
这是一种方式。我使用的技巧是根据给定的一个+两个额外的变量创建一个新的公式。然后我用公式的环境做了一个技巧,这样就可以使用xvar3
/ xvar5
和调用者本地的任何变量。
glm
将始终查看公式的环境和变量的数据(以及其他地方!)。这就是为什么在这种情况下必须对公式环境进行操作:它包含xvar3
和xvar5
,并且父环境设置为原始公式的环境,以便还搜索变量({{ 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)
我喜欢这个很干净。