在新的 dplyr 版本中破坏 NSE 功能
Breaking NSE function in new dplyr version
当更新到最新版本的包 dplyr 时,我使用 NSE 的一个功能中断了。我想知道新版本如何改变它以及如何修复它。我试过在每个变量名前使用 .data$
和 .env$
,但似乎无法正常工作。
这是我的自定义函数:
t_ppond <- function(w, v){
arguments <- as.list(match.call())
y <- eval(arguments$w)
x <- eval(arguments$v)
d <- data.frame("yy" = y,
"xx" = x)
tt <- sum(d$yy)
dff <- d %>%
mutate("sh" = yy/tt) %>%
mutate("rr" = xx*sh)
sum(dff$rr)
}
这就是我使用它的目的(从变量计算加权平均值):
data(iris)
iris %>%
group_by(Species) %>%
summarise("new" = t_ppond(Sepal.Length, Petal.Width))
以上代码在更新前运行良好。现在我得到:
Error in summarise_impl(.data, dots) :
Evaluation error: object 'Sepal.Length' not found.
您确定需要非标准评估吗?你有一个自定义函数,只需要接受两个向量,所以你可以这样写:
t_ppond <- function(w, v){
d <- data.frame("yy" = w,
"xx" = v)
tt <- sum(d$yy)
dff <- d %>%
mutate("sh" = yy/tt) %>%
mutate("rr" = xx*sh)
sum(dff$rr)
}
data(iris)
iris %>%
group_by(Species) %>%
summarise("new" = t_ppond(Sepal.Length, Petal.Width))
输出:
# A tibble: 3 x 2
Species new
<fctr> <dbl>
1 setosa 0.2480224
2 versicolor 1.3352089
3 virginica 2.0333030
当更新到最新版本的包 dplyr 时,我使用 NSE 的一个功能中断了。我想知道新版本如何改变它以及如何修复它。我试过在每个变量名前使用 .data$
和 .env$
,但似乎无法正常工作。
这是我的自定义函数:
t_ppond <- function(w, v){
arguments <- as.list(match.call())
y <- eval(arguments$w)
x <- eval(arguments$v)
d <- data.frame("yy" = y,
"xx" = x)
tt <- sum(d$yy)
dff <- d %>%
mutate("sh" = yy/tt) %>%
mutate("rr" = xx*sh)
sum(dff$rr)
}
这就是我使用它的目的(从变量计算加权平均值):
data(iris)
iris %>%
group_by(Species) %>%
summarise("new" = t_ppond(Sepal.Length, Petal.Width))
以上代码在更新前运行良好。现在我得到:
Error in summarise_impl(.data, dots) :
Evaluation error: object 'Sepal.Length' not found.
您确定需要非标准评估吗?你有一个自定义函数,只需要接受两个向量,所以你可以这样写:
t_ppond <- function(w, v){
d <- data.frame("yy" = w,
"xx" = v)
tt <- sum(d$yy)
dff <- d %>%
mutate("sh" = yy/tt) %>%
mutate("rr" = xx*sh)
sum(dff$rr)
}
data(iris)
iris %>%
group_by(Species) %>%
summarise("new" = t_ppond(Sepal.Length, Petal.Width))
输出:
# A tibble: 3 x 2
Species new
<fctr> <dbl>
1 setosa 0.2480224
2 versicolor 1.3352089
3 virginica 2.0333030