2017-10-19 122 views
0

我正在創建一個包,它使用non-standard evaluation來跟蹤列的含義。這個包在函數中傳遞一個數據幀,這些函數執行相同的一組列。非標準評價這一偉大工程:使用非標準評估與公式

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

不過,我想與公式工作的功能:

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。我試過各種組合quo(),enquo()!!,但基本問題是我不知道lm需要什麼樣的對象。

+0

我可以解決這個問題,得到如下:'new_lm < - 流明(不公開(選擇(DF ,!! xcol))〜unlist(select(df,!! ycol)))'但這樣很不雅,問題仍然存在,我不明白非標準評估如何與數據框一起工作 –

回答

1

您可以通過粘貼公式的值來創建公式,然後將公式傳遞給lm。我敢肯定有一個更好的方式來做到這一點,但這裏有一個工作方式:


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