[英]Programming Functions: NSE in DPLYR and PURRR
當前,當我嘗試將函數包裝在我多次使用的dplyr und purrr進行的一些計算周圍時,我遇到了非標准評估的一些問題。
我已經閱讀了有關NSE的文章,也認為我知道我的功能無法正常工作的地方-但是,我不知道為什么會這樣。
示例性地,我想將函數包裝在以下計算周圍,其中分組變量以及新變量的名稱,使用的分類變量和均值的輸入變量應該是動態的:
Data <- Data %>%
group_by(WeekBeforeRelease) %>%
mutate(visitors_genreother_instr = map_dbl(Genre_Category, ~ mean(Visitors[Genre_Category != .x]))) %>%
ungroup() %>%
as.data.frame()
果然這個功能為以下,使用NSE描述在這里 :
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 <<- Data %>%
group_by(!!GROUP_TIME) %>%
mutate(!!VARNAME := map_dbl(!!GROUP_MOVIE, ~mean(!!ENDOGVAR[!!GROUP_MOVIE != .x]))) %>%
ungroup() %>%
as.data.frame()
}
但是,這似乎無法很好地處理均值計算中的帶有括號的子集。 如果我用Visitors代替!! ENDOGVAR,一切都會按預期進行。 但是,按原樣,它會產生以下錯誤:
Error in NextMethod("[") : object '.x' not found
對於可以幫助我理解該問題的任何幫助,我感到很高興。
在此先多謝!
回旋曲
我們可以包裝!!
大括號以避免任何優先操作,現在應該可以正常工作
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
使用rlang 0.4.0
(經dplyr
0.8.2
測試),我們還可以使用{{...}}
來替代,引用和取消引用。 上一個函數可以寫成
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.