2017-05-01 22 views
0

我試圖使用字符串輸入函數,然後需要將其轉換爲R中的可用形式。例如: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)) 
} 

這工作正常。但是,我有時希望使用不同的公式和單個函數,因此我的「表達式」可以是"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)) 
} 

這是行不通的。有什麼建議麼?

+1

嘗試'as.formula(paste0(「variableA的〜」,表達式))' – Lamia

+0

使用一個公式而不是一個字符串,即'Expression =〜A * B * C',然後在函數內部使用'lme(update(VariableA〜。,expression))'。對'update'的調用會將你的公式'VariableA〜.'更新爲'VariableA〜A * B * C' – yeedle

回答

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

你甚至不需要match.call部分。你可以使用'lm(update(hp〜,expression),data)',然後調用像fun(mtcars,〜cyl)這樣的函數' – yeedle

相關問題