首页 > 解决方案 > 具有公式的函数的正确 dplyr 函数式编程语法是什么

问题描述

我正在尝试使用 dplyr 函数式编程指南编写一个函数来动态更改变量名。它适用于大多数 tidyverse 变量替换,但不适用于要评估的函数使用公式时。

一个绘图示例facet_wrap

library(dplyr)
library(ggplot2)

mtcars %>%
  ggplot(aes(hp, mpg)) +
  geom_point() +
  facet_wrap(~cyl)

f <- function(wrap_col) {
  mtcars %>%
  ggplot(aes(hp, mpg)) +
  geom_point() +
  facet_wrap(~ {{ wrap_col }})
}

f(cyl)

# Error in eval_tidy(facet, mask) : object 'cyl' not found

我尝试了上面的简单版本并使用引号"{{ wrap_col }}"和方括号。没有一个对我有用

标签: rdplyr

解决方案


我们可以使用rlang::inject

library(dplyr)
f <- function(wrap_col) {
  mtcars %>%
  ggplot(aes(hp, mpg)) +
  geom_point() +
  facet_wrap(rlang::inject(~ {{ wrap_col }}))
}

-测试

p1 <- mtcars %>%
 ggplot(aes(hp, mpg)) +
 geom_point() +
 facet_wrap(~cyl)

p2 <- f(cyl)
all.equal(p1, p2)
#[1] TRUE

推荐阅读