代码之家  ›  专栏  ›  技术社区  ›  Andy Carlson

r跨间接方向保留符号名

  •  0
  • Andy Carlson  · 技术社区  · 7 年前

    我做了一个这样的阴谋…

    ggplot(my_data, aes(x = ttd, y = aval)) +
      theme_bw() +
      geom_point(alpha = 0.25)
    

    这给了我一个很好的阴谋 ttd aval 作为我的轴标签。我喜欢它如何使用参数的名称作为默认标签。

    但是,我有很多这样的情节,我想把它抽象成我自己的 功能 . 但我似乎无法从函数内部绘制出这个图。以下是我的尝试:

    bw_plot <- function(data, x_, y_) {
      ggplot(data, aes(x = substitute(x_), y = substitute(y_))) +
        theme_bw() +
        geom_point(alpha = 0.25)
    }
    
    bw_plot(my_data, ttd, aval)
    

    但我得到这个错误:

    Error in (function (..., row.names = NULL, check.rows = FALSE, check.names = TRUE, : object 'x_' not found
    

    我只想把符号从 bw_plot 函数转换为 ggplot . 如何让它看到我的实际列名?

    (我还尝试将列名作为字符串传入并调用 as.name 但我得到了同样的结果。

    2 回复  |  直到 7 年前
        1
  •  1
  •   Artem Sokolov    7 年前

    substitute 将正确地“引用”您的参数 x_uuxcode>和 y_uuuxcode>。但是, aes 将在内部应用第二轮“报价”,这就是产生错误的原因。当您将呼叫传递给 aes时,您需要取消对其结果的引用。这可以使用 来完成!! operator from rlang

    库(ggplot2)
    图书馆(RLANG)
    bw_plot<-函数(.data,x_uu,y_u)
    {
    xsym<-ensym(x_uuu)
    Ysym<-ensym(是)
    ggplot(.data,aes(x=!!xsym,y=!!ysym))。+
    主题_bw()。+
    几何点(α=0.25)
    }
    

    请注意,要使用的正确功能是rlang::ensym,而不是substitute,因为您的目标是捕获单个符号(列名)。另外,我建议不要为您的参数命名data以避免与内置函数的名称冲突。

    以下示例用法:bw_plot(mtcars,mpg,wt)

    内部“引用”,这就是导致错误的原因。你需要把你的代替当你把电话传给俄歇电子能谱. 可以使用!!来自的运算符rlang.

    library( ggplot2 )
    library( rlang )
    bw_plot <- function( .data, x_, y_ )
    {
      xsym <- ensym(x_)
      ysym <- ensym(y_)
      ggplot( .data, aes(x = !!xsym, y = !!ysym) ) +
        theme_bw() +
        geom_point(alpha=0.25)
    }
    

    请注意,要使用的正确功能是rlang::ensym,而不是代替,因为您的目标是捕获单个符号(列名)。另外,我建议不要说出你的论点data以避免与内置函数的名称冲突。

    以下是示例用法:bw_plot( mtcars, mpg, wt ) enter image description here

        2
  •  0
  •   Andy Carlson    7 年前

    接受的答案适用于ggplot2版本 2.2.1.9000 后来呢。对于版本 2.2.1 之前,它看起来像 aes 这是不可能的。相反,我必须使用 aes_ 它提供了一个“逃生舱口”,允许我按预期为函数提供符号。解决方案如下:

    bw_plot <- function(data, x_, y_) {
      ggplot(data, aes_(x = substitute(x_), y = substitute(y_))) +
        theme_bw() +
        geom_point(alpha = 0.25)
    }
    
    bw_plot(my_data, ttd, aval)
    
    推荐文章