dplyr 函数内部的不一致行为
dplyr inconsistent behaviour inside function
当我没有单独使用 dplyr::mutate 函数,而是将其插入到函数中时,就会出现此问题,但它不起作用!看:
library(tidyverse)
data1<-data.frame(a=c(1:2), x1=c(2:3))
fun <- function(df1, coldf1){
df1 %>% mutate(coldf1 = 1) %>% return()
}
fun(data1, "a")
data1 %>% mutate("a" = 1)
两个代码完全相同,但结果出乎意料:
> fun(data1, "a")
a x1 coldf1
1 1 2 1
2 2 3 1
> data1 %>% mutate("a" = 1)
a x1
1 1 2
我知道等式赋值有问题,left_join 函数中也发生了同样的问题。这些事情有通用的解决方案吗?
你不能用 dplyr
来做到这一点,它在很大程度上是“non-standard 评估”(NSE)。在你的函数中,dplyr
看到 coldf1 = 1
并分配一个新列,就像你可以做的 df1 %>% mutate(somethingnew = 3.1415)
.
您需要使用 rlang
的转义机制(使用 :=
)...
fun <- function(df1, coldf1) {
df1 %>% mutate(!!coldf1 := 1)
}
data1
# a x1
# 1 1 2
# 2 2 3
fun(data1, "a")
# a x1
# 1 1 2
# 2 1 3
或基本 R :
fun <- function(df1, coldf1) { df1[[coldf1]] <- 1; df1; }
fun(data1, "a")
# a x1
# 1 1 2
# 2 1 3
(虽然我假设你的例子是简化的,这可能不那么简单)
无论如何,请查看“使用 dplyr 编程”,https://dplyr.tidyverse.org/articles/programming.html。
当我没有单独使用 dplyr::mutate 函数,而是将其插入到函数中时,就会出现此问题,但它不起作用!看:
library(tidyverse)
data1<-data.frame(a=c(1:2), x1=c(2:3))
fun <- function(df1, coldf1){
df1 %>% mutate(coldf1 = 1) %>% return()
}
fun(data1, "a")
data1 %>% mutate("a" = 1)
两个代码完全相同,但结果出乎意料:
> fun(data1, "a")
a x1 coldf1
1 1 2 1
2 2 3 1
> data1 %>% mutate("a" = 1)
a x1
1 1 2
我知道等式赋值有问题,left_join 函数中也发生了同样的问题。这些事情有通用的解决方案吗?
你不能用 dplyr
来做到这一点,它在很大程度上是“non-standard 评估”(NSE)。在你的函数中,dplyr
看到 coldf1 = 1
并分配一个新列,就像你可以做的 df1 %>% mutate(somethingnew = 3.1415)
.
您需要使用 rlang
的转义机制(使用 :=
)...
fun <- function(df1, coldf1) {
df1 %>% mutate(!!coldf1 := 1)
}
data1
# a x1
# 1 1 2
# 2 2 3
fun(data1, "a")
# a x1
# 1 1 2
# 2 1 3
或基本 R :
fun <- function(df1, coldf1) { df1[[coldf1]] <- 1; df1; }
fun(data1, "a")
# a x1
# 1 1 2
# 2 1 3
(虽然我假设你的例子是简化的,这可能不那么简单)
无论如何,请查看“使用 dplyr 编程”,https://dplyr.tidyverse.org/articles/programming.html。