2017-10-19 22 views
0

私はnon-standard evaluationを使用して列の意味を追跡するパッケージを作成しています。パッケージは関数間でデータフレームを渡します。さまざまなことが同じ列セットを実行します。非標準の評価はこのために素晴らしい作品:式で非標準的な評価を使用して

my_lm <- function(df, xcol, ycol) { 
    new_lm <- lm(!!xcol, !!ycol, data=df) 
    new_lm 
} 
my_lm(mtcars, quo(wt), quo(mpg) 

戻りError in !xcol : invalid argument type

my_select <- function(df, xcol, ycol) { 
    new_df <- dplyr::select(df, !!xcol, !!ycol) 
    new_df 
} 
my_select(mtcars, quo(wt), quo(mpg)) 

しかし、私は式で動作する機能をしたいと思います。 quo()enquo()!!の組み合わせを試してみましたが、基本的な問題は、どのような種類のオブジェクトが必要かわかりません。lmです。

+0

次のように私はこの問題を回避することができます: 'new_lm < - LM(非公開に(選択(DF 、!xcol))〜unlist(select(df、!! ycol))) ')しかし、これはかなり控えめで、データフレームで非標準的な評価がどのように機能するのか分からないという問題が残っています –

答えて

1

数式の値を貼り付けることで数式を作成し、数式をlmに渡すことができます。私はこれを行うには良い方法があります確信しているが、ここでは1つの作業アプローチがあります:


library(rlang) 

my_lm <- function(df, xcol, ycol) { 
    form <- as.formula(paste(ycol, " ~ ", xcol)[2]) 
    my_lm <- lm(form, data=df) 
    my_lm 
} 

my_lm(mtcars, quo(wt), quo(mpg)) 
#> 
#> Call: 
#> lm(formula = form, data = mtcars) 
#> 
#> Coefficients: 
#> (Intercept)   wt 
#>  37.285  -5.344 
関連する問題