【问题标题】:How to fix 'Quosures can only be unquoted within a quasiquotation context' error in R function如何修复 R 函数中的“Quosures 只能在 quasiquotation 上下文中不被引用”错误
【发布时间】:2019-08-19 18:03:12
【问题描述】:

我正在尝试使用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("Quosures 只能在一个 准引用上下文。", "", "# Bad:", "list(!!myquosure)", "", " # Good:", " dplyr::mutate(data, !!myquosure)"))

【问题讨论】:

    标签: r tidyverse rlang


    【解决方案1】:

    我们可以修改函数,将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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 您应该指出,它们似乎不需要引号,因为它们没有传入变量名
      • @Cettt Error in ~name == myname : object 'Chris' not found Called from: ~name == myname attr(,"class") [1] "quosure" "formula" attr(,".Environment") &lt;environment: 0x00000000124ce850&gt; 这就是我用你的代码得到的。
      • 你必须像这样调用函数:name_graph(babynames, "Robert", "M")
      猜你喜欢
      • 2021-09-02
      • 1970-01-01
      • 2020-03-09
      • 2018-01-16
      • 2019-10-29
      • 1970-01-01
      • 2023-02-09
      • 1970-01-01
      相关资源
      最近更新 更多