TLDR -为什么这个自定义函数不起作用?
library(ggplot2)
dat <- data.frame(date = c("2023-06-01", "2023-06-02", "2023-06-03"),
shots = c(8, 12, 10),
passes = c(340, 410, 390))
cust_ggplot <- function(df, date, metric){
min_date <- min({{ date }}) # invalid 'type' (closure argument)
# min_date <- min(!! ensym(date)) # Error in !ensym(x): invalid argument type.
# min_date <- min(df[[date]]) # works if date is enclosed in quotes like this dat |> cust_title("date", "shots")
# But I want it to look like tidyverse function with no quotes needed.
}
dat |>
cust_ggplot(date, shots)
我想模仿tidyverse风格,不需要使用dat |> cust_title("date", "shots")
完整走查:我试图把这个简单的ggplot代码转换成一个函数。
### Data
dat <- data.frame(date = c("2023-06-01", "2023-06-02", "2023-06-03"),
shots = c(8, 12, 10),
passes = c(340, 410, 390)
)
### Working Code
dat |>
ggplot(aes(x = date, y = shots)) +
geom_col() +
ggtitle(
paste(
"Shot Totals from",
min(dat$date),
"-",
max(dat$date)
)
)
我可以让情节工作刚刚好通过
### Turn it into a function
# This portion works
cust_ggplot <- function(df, date, metric){
df |>
ggplot(aes(x = {{ date }}, y = {{ metric }} )) +
geom_col()
}
dat |>
cust_ggplot(date, shots) +
ggtitle("Shot Totals")
但是当我试图找到最小或最大日期传递给副标题时,我的尝试都不起作用。
cust_ggplot <- function(df, date, metric){
# min_date <- min({{ date }}) invalid 'type' (closure argument)
# min_date <- min(!! ensym(date)) #Error in !ensym(x): invalid argument type.
# min_date <- min(df[[date]]) # works if date is enclosed in quotes like this dat |> cust_title("date", "shots")
# But I want it to look like tidyverse function with no quotes needed.
df |>
ggplot(aes(x = {{ date }}, y = {{ metric }} )) +
geom_col()
}
2条答案
按热度按时间h7appiyu1#
可能有很多方法可以做到这一点,但你可以做的一件事是:
(次要观点:我发现当你用与你可能传递的值相同的名字命名参数时,读这个函数有点混乱。如果是我,我会使用更通用的参数名称,如
function(df, var1, var2)
或其他名称。jobtbby32#
我们可以使用
rlang
包中的as_label
formerquo_name
:https://rlang.r-lib.org/reference/quo_label.html这些函数接受一个任意的R对象,通常是一个表达式,并将其表示为字符串。
使用此示例 Dataframe :
你想把这个工作ggplot
到自定义函数: