r - dplyr 函数内部行为不一致
问题描述
这个问题发生在我没有单独使用 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
,这在很大程度上是“非标准评估”(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 。
推荐阅读
- python - 有没有办法使用 django 中的 api 更新对象的特定字段?
- flutter - Flutter 如何结合 FutureBuilder 和 Consumer?
- python - 基于 2 列合并和对齐列
- javascript - 细化以在联合中键入别名
- python - 使用日期/日期时间无法使用 Pandas 创建新系列
- flutter - 为什么 ModalRoute 返回 null?
- admob - 很长一段时间后,admob 横幅从未开始显示。只有测试横幅有效
- reactjs - 内容安全策略指令块动态加载的内联脚本
- r - 使用 ggplot 在保持抖动的同时更改组内点的颜色
- c++ - 使用协程从 epoll_wait 处理事件的多线程