怪异的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)