编程功能: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

目前,我在尝试将函数包装在使用dplyr和purrr完成的一些计算中时遇到了一些非标准求值问题,我在多个场合使用了这些计算

我读过关于NSE的文章,也认为我知道我的功能不能正常工作的地方——但是,我不明白为什么会这样

例如,我想围绕以下计算包装一个函数,其中分组变量以及新变量的名称、使用的分类变量和平均值的输入变量应该是动态的:

 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