如何引用引号中的函数参数?

Non*_*per 3 r function ggplot2

我指定一个函数来绘制这样的图表:

func.plot <- function(z){
  df %>%
    ggplot(aes(z)) + 
    geom_histogram(aes(y =..density..), 
                   binwidth = 0.004,
                   col="red", 
                   fill="green", 
                   alpha=.2) + 
    geom_density(col=2) + 
    labs(title="title", x="z", y="vertical axis")
}
Run Code Online (Sandbox Code Playgroud)

目的是为数据集中的一些变量生成直方图,因此在这个函数中我还想使用变量名称作为轴的标题,x以便使图区分开来。但是,当使用变量调用函数时,例如func.plot(var)会出现错误:

不知道如何自动选择 tbl_ts/tbl_df/tbl/data.frame 类型的对象的比例。默认为连续。

错误:美学必须是长度 1 或与数据 (883) 相同:x

我有几个问题:

  1. 对于这个特定的功能,如何修复它?

  2. 更一般地说,有时我想编写引用引号中的参数的函数,例如上面的 x 标题。另一个简单的例子是读取或写入数据,如下所示:

func.write <- function(x){
  write.csv(x, file="x.csv", row.names=FALSE)
}
Run Code Online (Sandbox Code Playgroud)

当使用 调用时,该函数也无法正确实现func.write(df)。它将写入数据,但名称为"x.csv".

Ron*_*hah 6

根据您想要传递输入参数的方式,您可以使用以下函数之一。

传递引用的参数:

library(ggplot2)
library(rlang)

func.plot_quoted <- function(df, z){
   df %>%
     ggplot(aes(!!sym(z))) + 
     geom_histogram(aes(y =..density..), 
                        binwidth = 0.004,
                        col="red", 
                        fill="green", 
                        alpha=.2) + 
     geom_density(col=2) + 
     labs(title="title", x=z, y="vertical axis")
}
Run Code Online (Sandbox Code Playgroud)

可以用作

func.plot_quoted(mtcars, "cyl")
Run Code Online (Sandbox Code Playgroud)

并传递不带引号的参数

func.plot_unquoted <- function(df, z){
    df %>%
      ggplot(aes({{z}})) + 
      geom_histogram(aes(y =..density..), 
                     binwidth = 0.004,
                     col="red", 
                     fill="green", 
                     alpha=.2) + 
      geom_density(col=2) + 
      labs(title="title", x={{z}}, y="vertical axis")
} 
Run Code Online (Sandbox Code Playgroud)

可以用作

func.plot_unquoted(mtcars, cyl)
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述