如何修复 R 函数中的 'Quosures can only be unquoted within a quasiquotation context' 错误

How to fix 'Quosures can only be unquoted within a quasiquotation context' error in R function

我正在尝试使用 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)

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

Called from: abort(paste_line("Quosures can only be unquoted within a quasiquotation context.", "", " # Bad:", " list(!!myquosure)", "", " # Good:", " dplyr::mutate(data, !!myquosure)"))

我们可以通过在 filter

中将 quosures (enquo) 转换为字符串来修改函数
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)

函数 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))
}

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