我试图为一个函数使用字符串输入,然后需要在R中将其转换为可用的形式。例如:
我有以下功能:
MyFunction <- function(MyDataFrame){
Fit <- aov(VariableA ~ A * B * C, MyDataFrame)
model = lme(VariableA ~ A * B * C, random=~1| Sample, method="REML", MyDataFrame)
return(anova(model))
}
这很好用。但是,我有时想要使用单个函数的不同公式,所以我的&#34; Expression&#34;可以是"A * B * C"
或"A * C"
。我尝试使用:
MyFunction <- function(MyDataFrame, Expression = "A * B * C"){
Fit <- aov(VariableA ~ Expression, MyDataFrame)
model = lme(VariableA ~ Expression, random=~1| Sample, method="REML", MyDataFrame)
return(anova(model))
}
这不起作用。有什么建议吗?
答案 0 :(得分:1)
出于您的目的,您甚至不需要使用字符串,您可以直接传递表达式并将match.call()
与eval()
一起使用。一个玩具的例子是:
fun <- function(data, expression){
m <- match.call()
lm(hp ~ eval(m$expression), data)
}
fun(mtcars, cyl)
#Call:
#lm(formula = hp ~ eval(m$expression), data = data)
#Coefficients:
# (Intercept) eval(m$expression)
# -51.05 31.96
答案 1 :(得分:1)
R需要知道公式实际上是一个公式,当您有一个要用作公式中的表达式的字符串时,您会遇到评估表达式,环境等问题。根据你想要做的事情,我可能会设置我的功能:
library(nlme)
fun <- function(df, response, predictors){
model_formula <- as.formula(paste0(response, " ~ ", predictors))
fit <- aov(model_formula, df)
model = nlme::lme(model_formula, df)
return(anova(model))
}
fun(Orthodont, "distance", "age")
#> numDF denDF F-value p-value
#> (Intercept) 1 80 3096.4889 <.0001
#> age 1 80 85.8464 <.0001
fun(Orthodont, "distance", "age + Sex")
#> numDF denDF F-value p-value
#> (Intercept) 1 80 4226.931 <.0001
#> age 1 80 111.949 <.0001
#> Sex 1 25 4.429 0.0456