【问题标题】:How to refer to the function arguments in quotes?如何引用引号中的函数参数?
【发布时间】:2020-03-14 13:14:45
【问题描述】:

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

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")
}

目的是为数据集中的一些变量生成直方图,因此在这个函数中,我还想使用变量名称作为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)
}

使用func.write(df) 调用时,此功能也未正确实现。它将写入数据,但名称为"x.csv"

【问题讨论】:

  • 你需要使用tidyeval
  • 您可以通过 df$new_var &lt;- df[, z] 然后在 aes 中显式使用 new_var 来解决此问题

标签: r function ggplot2


【解决方案1】:

根据您希望如何传递输入参数,您可以使用以下函数之一。

传递引用的参数:

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")
}

可以用作

func.plot_quoted(mtcars, "cyl")

并传递不带引号的参数

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")
} 

可以用作

func.plot_unquoted(mtcars, cyl)

【讨论】:

  • 我尝试了这些函数,它们可以绘制图表,但无法成功引用引号中的参数。
  • @NonSleeper 我不确定你想在这里做什么?可以举个例子吗?
  • 我的意思是当我实现你的功能时,我可以获得图表。但是,x 标签仍然显示为“z”而不是“cyl”。
  • @NonSleeper 哦..我错过了。我已经更新了答案,它现在应该适用于两个版本。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-11
  • 2020-08-12
  • 2012-02-03
  • 1970-01-01
  • 2014-01-30
相关资源
最近更新 更多