首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >其他功能中的ggplot2中的lazyeval

其他功能中的ggplot2中的lazyeval
EN

Stack Overflow用户
提问于 2015-03-02 18:16:16
回答 1查看 404关注 0票数 4

我有一个问题,我在这个solution中找不到答案。我的意思是,我想在一个新的函数中使用ggplot函数。

代码语言:javascript
复制
library(ggplot2)
draw_point <- function(data, x, y ){
  ggplot(data, aes_string(x, y)) +
    geom_point()
}

因此,我不得不使用引号:

代码语言:javascript
复制
draw_point(mtcars, "wt", "qsec")

相反,我想以某种方式使用lazyeval包来编写这个函数,没有引号:

代码语言:javascript
复制
draw_point(mtcars, wt, qsec)

这是可能的吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-03 09:31:19

一种方法是使用substituteaes_q

代码语言:javascript
复制
draw_point <- function(data, x, y){
  ggplot(data, aes_q(substitute(x), substitute(y))) +
    geom_point()
}
draw_point(mtcars, wt, qsec)

但是,如果您希望draw_point(mtcars, wt, qsec)draw_point(mtcars, "wt", "qsec")都能工作,那么您必须更具创造性。下面是您可以使用lazyeval包做什么的第一个草案。这不能处理所有的情况,但它应该让你开始。

代码语言:javascript
复制
draw_point <- function(data, x, y, ...){
  # lazy x and y
  ld <- as.lazy_dots(list(x = lazy(x), y = lazy(y))) 
  # combine with dots
  ld <- c(ld, lazy_dots(...))
  # change to names wherever possible 
  ld <- as.lazy_dots(lapply(ld, function(x){ 
    try(x$expr <- as.name(x$expr), silent=TRUE)
    x
  }))
  # create call
  cl <- make_call(quote(aes), ld)
  # ggplot command
  ggplot(data, eval(cl$expr)) +
    geom_point()
}

# examples that work 
draw_point(mtcars, wt, qsec, col = factor(cyl))
draw_point(mtcars, "wt", "qsec")
draw_point(mtcars, wt, 'qsec', col = factor(cyl))

# examples that doesn't work
draw_point(mtcars, "wt", "qsec", col = "factor(cyl)")
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/28816684

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档