怪异的dplyr+;NSE:在mutate内部的自定义函数中使用NSE

怪异的dplyr+;NSE:在mutate内部的自定义函数中使用NSE,r,dplyr,nse,R,Dplyr,Nse,在dplyr::mutate中的自定义函数中使用NSE时,我遇到了一个问题。考虑下面的代码: require(tidyverse) f <- function(var) { varname <- deparse(substitute(var)) v1 <- as.name(sprintf("%s.Width", varname)) v2 <- as.name(sprintf("%s.Length", varname)) return(

dplyr::mutate
中的自定义函数中使用NSE时,我遇到了一个问题。考虑下面的代码:

require(tidyverse)

f <- function(var) {
  varname <- deparse(substitute(var))
  v1      <- as.name(sprintf("%s.Width", varname))
  v2      <- as.name(sprintf("%s.Length", varname))
  return(substitute(v1 + v2))
}

iris %>% 
  mutate(
    test = f(Sepal) %>% eval()
  )

ff <- function(var) {
  varname <- deparse(substitute(var))
  v1      <- as.name(sprintf("%s.Width", varname))
  v2      <- as.name(sprintf("%s.Length", varname))
  substitute(v1 + v2) %>% eval.parent(n = 1)
}

iris %>% 
  mutate(
    test = ff(Sepal)
  )
require(tidyverse)

f使用
整理评估“取消报价”运算符:

ff <- function(var) {
  varname <- deparse(substitute(var))
  v1      <- as.name(sprintf("%s.Width", varname))
  v2      <- as.name(sprintf("%s.Length", varname))
  substitute(v1 + v2)
}

iris %>% 
  head() %>% 
  mutate(
    test = !! ff(Sepal)
  )

谢谢,但这只是eval的一个更好的变体,对吗?“为什么我不能直接进入正确的环境?”杰克不太清楚。
运算符执行“取消引用”,而不是计算。我用它是因为在新的节日里,它让我感觉更自然。但是您可以通过删除管道
%%>%%
(这会弄乱调用环境的层次结构):
eval.parent(替换(v1+v2),n=1)