我正在尝试使用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)”))
答案 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)
答案 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。在您的情况下,您要将字符串作为输入传递,因此您不需要担保,因此最好不要在情况下使用它们。