R:将字符串从函数输入转换为函数中表达式的一部分
R: Convert a string from a function input to part of an expression in the function
我正在尝试将字符串输入用于函数,然后需要将其转换为 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))
}
这很好用。但是,有时我想对一个函数使用不同的公式,因此我的 "Expression" 可以是 "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))
}
这不起作用。有什么建议吗?
为了您的目的,您甚至不需要使用字符串,您可以直接传递表达式并使用 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
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
我正在尝试将字符串输入用于函数,然后需要将其转换为 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))
}
这很好用。但是,有时我想对一个函数使用不同的公式,因此我的 "Expression" 可以是 "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))
}
这不起作用。有什么建议吗?
为了您的目的,您甚至不需要使用字符串,您可以直接传递表达式并使用 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
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