我想将公式的右侧传递给R函数,然后"添加"公式的左侧并调用gam()
。我想在没有丑陋的as.formula()结构等的情况下实现这一目标。
我陷入了以下最小的例子,你知道出了什么问题吗?
require(mgcv)
set.seed(0) ## set.seed(1)
gamEx1 <- gamSim(1, n=400, dist="normal", scale=2) ## simulate some data
str(gamEx1) ## display structure
## calling gam() and passing the right-hand side of a formula
gamFitter <- function(formula.RHS, data, ...){
z <- 2*data$y + data$f0 # some given values
gam(z ~ formula.RHS, data=data, ...) # call gam()
}
## call the function with the right-hand side of a formula
gamFitter(formula.RHS=~s(x0)+s(x1)+s(x2)+s(x3), data=gamEx1)
Error in model.frame.default(formula = z ~ formula.RHS, data = data,
drop.unused.levels = TRUE) :
invalid type (language) for variable 'formula.RHS'
答案 0 :(得分:12)
您似乎应该使用R的内置功能,即update.formula
,无需编写新功能:
> form <- ~s(x0)+s(x1)+s(x2)+s(x3)
> form
~s(x0)+s(x1)+s(x2)+s(x3)
> update.formula(form, z ~ .)
z ~ s(x0) + s(x1) + s(x2) + s(x3)
答案 1 :(得分:5)
这是基于@ gsk3的想法构建的版本:
changeLHS <- function(formula, lhs) {
if (length(formula) == 2) {
formula[[3]] <- formula[[2]]
}
formula[[2]] <- substitute(lhs)
formula
}
changeLHS(a~b+c, z+w) # z + w ~ b + c
changeLHS(~b+c, z+w) # z + w ~ b + c
因此,您的代码变为:
gamFitter <- function(formula.RHS, data, ...){
frm <- changeLHS(formula.RHS, 2*y + f0)
gam(frm, data=data, ...) # call gam()
}
答案 2 :(得分:4)
Kludgy但它有效:
form1 <- as.formula("hi ~ lo + mid")
form2 <- as.formula("blue ~ red + green")
form2[[3]] <- form1[[3]]
> form2
blue ~ lo + mid
答案 3 :(得分:0)
在其他答案的基础上,如果您需要替换LHS programmatically by passing strings(àlareformulate
),那么两个小调整可以提供帮助。
使用@ Tommy的方法:
changeLHS <- function(formula, lhs) {
if (length(formula) == 2) {
formula[[3]] <- formula[[2]]
}
formula[[2]] <- as.symbol(lhs)
formula
}
form <- ~s(x0)+s(x1)+s(x2)+s(x3)
changeLHS(form, "z")
## z ~ s(x0) + s(x1) + s(x2) + s(x3)
使用@ Derek的方法:
update(form, reformulate(".", "z"))
## z ~ s(x0) + s(x1) + s(x2) + s(x3)