【问题标题】:dplyr inconsistent behaviour inside functiondplyr 函数内部行为不一致
【发布时间】:2021-01-20 12:29:11
【问题描述】:

这个问题发生在我没有单独使用 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 函数中。这些事情有通用的解决方案吗?

【问题讨论】:

标签: r function dplyr variable-assignment


【解决方案1】:

dplyr 无法做到这一点,因为它严重依赖于“非标准评估”(NSE)。在您的函数内部,dplyr 看到 coldf1 = 1 并分配一个新列,就像您可以执行 df1 %&gt;% 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 2018-12-23
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    相关资源
    最近更新 更多