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

내가이 문제를 해결 얻을 수 있습니다 , xcol)) ~ unlist (select (df, !! ycol)))')하지만 이것은 꽤 우아하지 않고, 비표준 평가가 데이터 프레임과 함께 작동하는 방식을 이해하지 못하는 문제가 남아 있습니다. –

답변

1

수식의 값을 함께 붙여 넣은 수식을 만든 다음 수식을 lm으로 전달할 수 있습니다. (DF LM (올라가지 (선택 -`new_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