在新的dplyr版本中打破NSE功能

时间:2017-06-22 00:30:30

标签: r dplyr summarize

当更新到最新版本的软件包 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.

1 个答案:

答案 0 :(得分:1)

您确定需要对此进行非标准评估吗?你有一个自定义函数,只需要接受两个向量,所以你可以写它:

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