如何修复R函数中的“仅在准引用上下文中不能取消引用”错误

时间:2019-03-28 20:42:31

标签: r tidyverse rlang

我正在尝试使用rlang编写第一个函数,但在解决以下错误时遇到了一些麻烦。

我已经读过vignette,但没有看到一个很好的例子来说明我要做什么。

library(babynames)
library(tidyverse)

name_graph <- function(data, name, sex){
name <- enquo(name)
sex <- enquo(sex)

data %>%
  filter_(name == !!name, sex == !!sex) %>%
  select(year, prop) %>%
  ggplot()+
  geom_line(mapping = aes(year, prop))
}

name_graph(babynames, Robert, M)

我期待我的分布图,但出现错误:

  

从以下位置调用:abort(paste_line(“只能在   准引用上下文。”,      “”,“#错误:”,“ list(!! myquosure)”,      “”,“#好:”,“ dplyr :: mutate(data,!! myquosure)”))

2 个答案:

答案 0 :(得分:3)

我们可以通过将等量(enquo)转换为filter中的字符串来修改函数

library(rlang)
library(dplyr)
library(ggplot2)
name_graph <- function(data, name, sex){
   name <- enquo(name)
   sex <- enquo(sex)

    data %>%
      filter(name == !! as_label(name), sex == !! as_label(sex)) %>%
      select(year, prop) %>%
      ggplot()+
              geom_line(mapping = aes(year, prop))
    }

name_graph(babynames, Robert, M)

enter image description here

答案 1 :(得分:3)

不推荐使用函数filter_,您应避免使用它。 另外,如果变量名称与输入相同,则dplyr::filter也无法正常工作。

尝试一下:

name_graph <- function(data, myname, mysex){

data %>%
  filter(name == myname, sex == mysex) %>%
  select(year, prop) %>%
  ggplot()+
  geom_line(mapping = aes(year, prop))
}

此外,如注释中所述,如果尝试将列名作为输入参数传递,则使用quores。在您的情况下,您要将字符串作为输入传递,因此您不需要担保,因此最好不要在情况​​下使用它们。