2017-05-01 11 views
0

関数に文字列入力を使用しようとしましたが、Rで使用可能な形式に変換する必要があります。R:関数の入力から関数の式の一部に文字列を変換する

私は以下の機能を持っています:

これは問題なく動作します。しかし、私は時には一つの関数で異なる式を使いたいので、私の "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

'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()を使用することができます。

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

関連する問題