使用{{foo}}将变量名列表传递给函数

时间:2019-10-03 00:23:00

标签: r purrr

问题

我想知道如何将变量名列表传递给purrr::map2函数,以便在单独的数据帧上进行迭代。

下面的input_table$key变量包含mpg数据集中的dispmtcars。我认为变量名称是作为字符串而不是变量名称传递的。问题是我该如何更改它,以便我的函数识别出它们是变量名(?)。

在此示例中,我试图求和mtcars变量mpgdisp中所有低于一组数字阈值的值。来自mtcars的那些变量和相关阈值包含在input_table(如下)中。

理想的结果

percentile   key    value  sum_y
  <fct>     <chr>   <dbl>  <dbl>
1 0.5        mpg    19.2   266.5
2 0.9        mpg    30.1   515.8
3 0.99       mpg    33.4   609.0
4 1          mpg    33.9   642.9
5 ...        ...    ...    ...

尝试

library(dplyr)
library(purrr)
library(tidyr)
# Arrange a generic example
# Replicating my data structure
input_table <- mtcars %>% 
  as_tibble() %>% 
  select(mpg, disp) %>% 
  map_df(quantile, probs = c(0.5, 0.90, 0.99, 1)) %>% 
  mutate(
    percentile = factor(c(0.5, 0.90, 0.99, 1))
  ) %>% 
  select(
    percentile, mpg, disp
  ) %>% 
  gather(key, value, -percentile)

# Defining the function
test_func <- function(label_desc, threshold) {
  mtcars %>% 
    select({{label_desc}}) %>% 
    filter({{label_desc}} <= {{threshold}}) %>% 
    summarise(
      sum_y = sum(as.numeric({{label_desc}}), na.rm = T)
    )
}

# Demo'ing that it works for a single variable and threshold value
test_func(label_desc = mpg, threshold = 19.2)

# This is where I am having trouble
# Trying to iterate over multiple (mpg, disp) variables
map2(input_table$key, input_table$value, ~test_func(label_desc = .x, threshold = .y))

1 个答案:

答案 0 :(得分:1)

问题是卷曲的({{}})用于首次引用时未引用的变量。在您的第二次尝试中,您传递了卷曲卷曲运算符不起作用的带引号的变量。一个简单的解决方法是使用_at的{​​{1}}变体,它接受带引号的参数。

dplyr