R:将函数输入中的字符串转换为函数中表达式的一部分

时间:2017-05-01 22:04:52

标签: r function parsing eval

我试图为一个函数使用字符串输入,然后需要在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))
}

这不起作用。有什么建议吗?

2 个答案:

答案 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