如何用dplyr和点椭圆编写嵌套函数?

时间:2018-08-22 08:59:38

标签: r dplyr nested nse

我正在尝试尽可能简化

一些样本数据:

library(magrittr)
library(dplyr)
library(rlang)

# sample data
tib <- tibble(
  a = 1:3,
  b = 4:6,
  c = 7:9
)

现在有一个将两列相加的函数:

foo = function(df, x, y) {

  x <- enquo(x)
  y <- enquo(y)

  df %>% 
   select( !! x, !! y) %>% 
   mutate(sum = !! x + !! y) 
}

希望它能起作用:

foo(tib, a, b) # to show it works

# A tibble: 3 x 3
#       a     b   sum
#   <int> <int> <int>
# 1     1     4     5
# 2     2     5     7
# 3     3     6     9

现在,我要编写第二个函数,该函数具有不固定数量的参数,它将使用所有可能的参数对调用foo

foo.each(tib, a, b, c) 
# calls foo(tib, a, b)
# calls foo(tib, a, c)
# calls foo(tib, b, c)
# i.e calls foo for each possible pair

我已经尝试过了,但这不起作用:

foo.each = function(df, ...) {
  args <- sapply(substitute(list(...))[-1], deparse)
  args

  nb.args <- args %>% length
  for (i in nb.args:2)
    for (j in 1:(i - 1))
      foo(df, args[i], args[j]) %>% print
}

问题出在foo内部:

   mutate(sum = !! x + !! y) 

我认为它的评估为:

  mutate(sum = args[i] + args[j])

我已经尝试过许多事情,包括使用rlang::quos,但我对此感到厌烦,需要您的帮助。


编辑:克里斯发现了一个巧妙而简单的技巧来纠正我的foo.each功能。在这种情况下,有没有更自然的方式来处理...椭圆?

例如,有比在函数开始时获得args更好的方法:

  args <- sapply(substitute(list(...))[-1], deparse)

0 个答案:

没有答案