【问题标题】:Call to ggplot in a function with NSE使用 NSE 在函数中调用 ggplot
【发布时间】:2015-09-21 10:17:25
【问题描述】:

这个想法是在函数中修补对 ggplot 的调用。

例子:

library(dplyr)
library(ggplot2)
library(lazyeval)

df <- data.frame(A=letters[1:10], B=2:11, C=3:12))

func <- function(name, dat=df) {

  output <- dat %>%
    select_(~A,name) %>%
    arrange_(interp(~desc(var), var=as.name(name)))

  plot <- 
    ggplot(output, aes_string(x=reorder(~A,-name), y=B)) +
    geom_bar(stat='identity')

  print(plot)
  return(plot)

}

result <- func("B")

编译给出:

-name 错误:一元运算符的参数无效。

我试过deparsesubstitute。不确定我得到了正确的组合。有任何想法吗?

【问题讨论】:

  • 我不确定reorder 在这里的用途是什么——看起来你正试图针对不匹配的A 绘制B。这不是一个好主意,我认为 ggplot 不支持它。
  • @@Konrad:请参阅之前的question 了解reorder 解决的问题。
  • 啊,我明白了,这是有道理的。但是,解决这个问题很简单,不是吗?只需在 ggplot 调用之外重新排序因子即可。
  • 我试过 :-) 无济于事,到目前为止。关心分享一个方法吗?谢谢
  • 是的,结果比我想象的要难。无论如何,看看我的答案。

标签: r ggplot2 func nse


【解决方案1】:

在将数据传递给ggplot 之前对其进行重新排序。以下代码还在 ggplot 调用中移动了一些列名,因为否则无论name 参数如何,您总是会针对B 绘制A — 还是故意的?

function (dat, name) {
    var = as.name(name)
    reord = list(interp(~ reorder(var, -var), var = var))
    output = dat %>%
        select_(~A, name) %>% # Not actually necessary.
        arrange_(interp(~ desc(var), var = var)) %>%
        mutate_(.dots = setNames(reord, name))

    plot = ggplot(output, aes_string(x = 'A', y = name)) +
        geom_bar(stat = 'identity')

    plot(plot)
    plot
}

func(df, 'B')

我在这里使用mutate_(.dots = …) 表单。查看 dplyr 的“NSE”小插图,了解有关其用法的更多信息。

【讨论】:

  • @@Konrad:唯一需要的重新排序是在获得output 之后,以强制 ggplot 在绘图时打破字母绑定。到目前为止,我发现这个块可以工作:ggplot(output,aes_string(x=quote(A), y=B) )+... 在问题中。现在,如何使用 reorder 进行重新排序??
  • @remi 好吧,你还是会像我的回答那样做。
  • @@Konrad:抱歉,它实际上并没有产生所需的结果。我认为是电话mutate_ 搞砸了。基本上,我们必须在本地环境中使dat$A &lt;- reorder(dat$A, -dat$name) 可执行。就在调用 ggplot 之前。
  • @remi 你真的想重新排序A 而不是name 是什么?如果是这样,代码很容易改编,只需将mutate_语句更改为mutate_(A = interp(~ reorder(A, -var), var = var))即可。
猜你喜欢
  • 2018-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多