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