2017-10-19 91 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