R 中的非标准评估。我想将公式发送到使用lm
.
我有一个带有一个响应的数据框:y 和许多预测变量。我将在函数中拟合模型。该函数将接收作为字符串的过滤条件和作为字符串的预测变量的名称。响应将作为名称输入。该函数将根据过滤条件进行过滤,然后使用作为字符串发送给它的预测变量来拟合模型。我无法让预测器字符串正常工作。
这非常接近使用带有公式的非标准评估。事实上,我说明了这个解决方案,这让我成为了其中的一部分。区别:我想发送一个带有我的预测器值的字符串,而不是将预测器发送到函数。
用例:最终我会把它放在一个闪亮的应用程序中,让用户选择预测器和响应以及过滤器。
这是有效的:
# create a data frame.
n <- 100
levels_1 <- sample(c("a","b","c"),n,replace=TRUE)
levels_2 <- sample(c("a","b","c"),n,replace=TRUE)
d <-tibble(l_1 = levels_1 ,l_2 = levels_2, y = rnorm(n))
# A function that works
my_lm <- function(d,predictor,response,filter_criteria){
d1 <- d %>% filter(l_2 == 'a')
lm(y ~ l_1,data=d1)
}
my_lm(d,l_1,y,'a')
my_lm2 <- function(d,predictor,response,filter_criteria){
enquo_predictor <- enquo(predictor)
enquo_response <- enquo(response)
enquo_filter_criteria <- enquo(filter_criteria)
d1 <- d %>% filter(l_2 == !!filter_criteria)
form <- as.formula(paste(enquo_response, " ~ ", predictor)[2])
# form <- as.formula(paste(enquo_response, " ~ ", enquo_predictor)[2]) wrong way to do it.
lm(form,data=d1)
#lm(!!enqu_preditor ~ !!enquo_response,data=d1)
}
selected_var <- names(d)[1]
selected_var
filter_value <- 'a'
my_lm2(d,l_1,y,filter_value) # This works but is not what I want.
my_lm2(d,selected_var,y,filter_value) # This does not work but is what I want to work.