2017-05-01 1 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)) 
} 

이 작동합니다. 그러나 "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)) 
} 

이것은 작동하지 않습니다. 어떤 제안?

+1

하는' – Lamia

+0

사용'as.formula (paste0 ("VariableA ~"식)) 시도 즉'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()을 사용할 수 있습니다.

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