如何在R中传递一个不带引号的列名给一个自定义的摘要函数(min)?

5jvtdoz2  于 2023-06-03  发布在  其他
关注(0)|答案(2)|浏览(133)

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() 
  
}
h7appiyu

h7appiyu1#

可能有很多方法可以做到这一点,但你可以做的一件事是:

min_date <- df |> pull({{date}}) |> min()

(次要观点:我发现当你用与你可能传递的值相同的名字命名参数时,读这个函数有点混乱。如果是我,我会使用更通用的参数名称,如function(df, var1, var2)或其他名称。

jobtbby3

jobtbby32#

我们可以使用rlang包中的as_label former quo_namehttps://rlang.r-lib.org/reference/quo_label.html

这些函数接受一个任意的R对象,通常是一个表达式,并将其表示为字符串。

使用此示例 Dataframe :
dat <- data.frame(
  date = c("2023-06-01", "2023-06-02", "2023-06-03"),
  shots = c(8, 12, 10),
  passes = c(340, 410, 390)
)
你想把这个工作ggplot
library(ggplot2)

dat %>% 
  ggplot(aes(x = date, y = shots))+
  geom_col()+
  ggtitle(paste("Shot Totals from", min(dat$date), "-", max(dat$date))
          )
到自定义函数:
library(ggplot2)
library(dplyr)
library(rlang)

cust_ggplot <- function(df, x, y) {
  x <- enquo(x)  # Quote the 'x' argument
  y <- enquo(y)  # Quote the 'y' argument
  
  ggplot(df, aes(x = !!x, y = !!y)) +
    geom_col() +
    ggtitle(paste("Shot Totals from", min(df[[as_label(x)]]), "-", max(df[[as_label(x)]])))
}

cust_ggplot(dat, date, shots)

相关问题