如何修复 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,最好不要在您的情况下使用它们。
我正在尝试使用 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
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,最好不要在您的情况下使用它们。