编程功能:DPLYR和PURRR中的NSE
目前,我在尝试将函数包装在使用dplyr和purrr完成的一些计算中时遇到了一些非标准求值问题,我在多个场合使用了这些计算 我读过关于NSE的文章,也认为我知道我的功能不能正常工作的地方——但是,我不明白为什么会这样 例如,我想围绕以下计算包装一个函数,其中分组变量以及新变量的名称、使用的分类变量和平均值的输入变量应该是动态的:编程功能:DPLYR和PURRR中的NSE,r,tidyverse,purrr,nse,R,Tidyverse,Purrr,Nse,目前,我在尝试将函数包装在使用dplyr和purrr完成的一些计算中时遇到了一些非标准求值问题,我在多个场合使用了这些计算 我读过关于NSE的文章,也认为我知道我的功能不能正常工作的地方——但是,我不明白为什么会这样 例如,我想围绕以下计算包装一个函数,其中分组变量以及新变量的名称、使用的分类变量和平均值的输入变量应该是动态的: Data <- Data %>% group_by(WeekBeforeRelease) %>% mutate(visitors_genre
Data <- Data %>%
group_by(WeekBeforeRelease) %>%
mutate(visitors_genreother_instr = map_dbl(Genre_Category, ~ mean(Visitors[Genre_Category != .x]))) %>%
ungroup() %>%
as.data.frame()
我很高兴能得到帮助,帮助我理解这个问题
提前多谢
回旋曲我们可以包装
代码>在大括号中,以避免任何操作优先级,现在应该可以正常工作
library(tidyverse)
Function_Other <- function(ENDOGVAR, VARNAME, GROUP_MOVIE, GROUP_TIME){
ENDOGVAR <- enquo(ENDOGVAR)
VARNAME <- quo_name(enquo(VARNAME))
GROUP_MOVIE <- enquo(GROUP_MOVIE)
GROUP_TIME <- enquo(GROUP_TIME)
Data %>%
group_by(!!GROUP_TIME) %>%
mutate(!!VARNAME := map_dbl(!!GROUP_MOVIE, ~
mean((!!ENDOGVAR)[(!!GROUP_MOVIE) != .x]))) %>%
ungroup() %>%
as.data.frame()
}
Data <- mtcars
out <- Function_Other(mpg, newcol, am, gear)
head(out, 3)
# mpg cyl disp hp drat wt qsec vs am gear carb newcol
#1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 21.05
#2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 21.05
#3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 21.05
-检查以前的输出
identical(out1, out)
[1] TRUE
阿克伦,你是我的英雄-非常感谢,这解决了问题(还有我的夜晚!)。知道为什么没有括号的情况下评估失败了吗?@RondoBohrens原因可能是操作优先级,因为在创建逻辑表达式、子集等的过程中,会发生很多活动。@akrun的解决方案非常有效,但有两件事需要指出,以获得良好的编程实践(@akrun肯定知道,但一些新读者可能不知道):1.传递数据,而不是使用全局变量data。2.如果变量是从列表或c()绑定传递的,则传递不带引号的变量将不起作用。将它们作为字符串传递更为实际,在这种情况下,它们必须通过'rlang::syms()进行转换(类似于enquo)`
library(tidyverse)
Function_Other <- function(ENDOGVAR, VARNAME, GROUP_MOVIE, GROUP_TIME){
ENDOGVAR <- enquo(ENDOGVAR)
VARNAME <- quo_name(enquo(VARNAME))
GROUP_MOVIE <- enquo(GROUP_MOVIE)
GROUP_TIME <- enquo(GROUP_TIME)
Data %>%
group_by(!!GROUP_TIME) %>%
mutate(!!VARNAME := map_dbl(!!GROUP_MOVIE, ~
mean((!!ENDOGVAR)[(!!GROUP_MOVIE) != .x]))) %>%
ungroup() %>%
as.data.frame()
}
Data <- mtcars
out <- Function_Other(mpg, newcol, am, gear)
head(out, 3)
# mpg cyl disp hp drat wt qsec vs am gear carb newcol
#1 21.0 6 160 110 3.90 2.620 16.46 0 1 4 4 21.05
#2 21.0 6 160 110 3.90 2.875 17.02 0 1 4 4 21.05
#3 22.8 4 108 93 3.85 2.320 18.61 1 1 4 1 21.05
Function_OtherN <- function(ENDOGVAR, VARNAME, GROUP_MOVIE, GROUP_TIME){
Data %>%
group_by({{GROUP_TIME}}) %>%
mutate({{VARNAME}} := map_dbl({{GROUP_MOVIE}}, ~
mean({{ENDOGVAR}}[{{GROUP_MOVIE}} != .x]))) %>%
ungroup() %>%
as.data.frame()
}
out1 <- Function_OtherN(mpg, newcol, am, gear)
identical(out1, out)
[1] TRUE