函数内函数中的ggplot:传递参数

时间:2017-07-31 20:57:01

标签: r function ggplot2 nested tidyverse

我很难弄清楚如何通过对ggplot的嵌套函数调用传递参数。一个例子将有助于说明:

library('tidyverse')

dset <- tibble(
  xvar = 1:5,
  yvar = 6:10
)

plot_inner <- function(.outcome) {

  ggplot(dset, aes(x=xvar)) +
    geom_line(aes_(y=substitute(.outcome)))
}

现在我可以致电plot_inner(.outcome=yvar),它会正确绘制yvarxvar的折线图。但是,当我想在另一个函数中嵌套plot_inner()时会出现问题:

plot_outer <- function(..outcome) {

  plot_inner(.outcome=..outcome)
}

目的是让我致电plot_outer()并将..outcome指定为dset列,然后将其传递到.outcome中的plot_inner(),然后ggplot()> plot_outer(..outcome=yvar) Error in FUN(X[[i]], ...) : object '..outcome' not found 绘制。但它不起作用:

parse()

我尝试了eval()substitute()deparse()plot_inner_2 <- function(.outcome) { .outcome <- enquo(.outcome) dset %>% rename(value = UQ(.outcome)) %>% ggplot(aes(xvar, value)) + geom_line() } 的各种组合,但无法弄清楚如何制作这种嵌套函数打电话。

我也尝试了另一种方法:

plot_inner_2(.outcome=yvar)

通过这种方法,我可以致电yvar并正确生成xvarplot_outer_2 <- function(..outcome) { plot_inner_2(.outcome=..outcome) } > plot_outer_2(..outcome=yvar) Error: `..outcome` contains unknown variables 的折线图。但是,当我尝试将其嵌套在另一个函数中然后调用外部函数时,我再次遇到错误:

keel.sh/policy=major

任何帮助将不胜感激。我更倾向于按照我尝试过的第一种方法来解决问题,但如果任何人都有第二种方法的解决方案,或完全采用其他方法,我会很乐意学习任何有用的方法。

1 个答案:

答案 0 :(得分:0)

根据@ aosmith评论中的链接,在plot_inner()函数中将eval(substitute())包裹在plot_outer()内似乎是一种解决方案。

plot_outer <- function(..outcome) {

  eval(substitute(plot_inner(.outcome=..outcome)))
}

现在,对plot_outer(..outcome=yvar)的调用按预期工作,将yvar传递到.outcome中的inner_plot(),然后传递到ggplot()并针对{{ 1}}。