0

我制作了下面的散点图函数。

scatter_fun<-function(data,xval,yval,xlabel,ylabel, labels){
  xval <- enquo(xval)
  yval <- enquo(yval)
  
  ggplot(data, aes(!!xval, !!yval))+
    geom_smooth(method=lm, se=FALSE)+
    geom_point()+
    theme(axis.line.x.bottom = element_line("black"),
          axis.line.y.left = element_line("black"),
          axis.text.x = element_blank(),
          legend.title = element_blank())+ylab(ylabel)+
    xlab(xlabel)+
    scale_y_continuous(labels = scales::comma)+
    expand_limits(y = 0)+
    geom_smooth(method="lm", se=FALSE, colour="red")+
    annotate("text",
             x=max(!!xval)/2,
             y =0,
             label = labels)
  }

但是,我无法使方程式的注释部分起作用。如果我调用该函数,则会收到错误消息:

错误:Quosures 只能在 quasiquotation 上下文中不被引用。

坏的:

列表(!!myquosure)

好的:

dplyr::mutate(数据, !!myquosure)

但是,当我删除代码的注释部分时,它工作得很好。我必须对代码进行哪些更改才能使其正常工作?

4

1 回答 1

0

如果您使用 捕获符号ensym,则可以eval在 的上下文中使用它们df

scatter_fun<-function(data,xval,yval,xlabel,ylabel, labels){
  xval <- ensym(xval)
  yval <- ensym(yval)
  
  ggplot(data, aes(!!xval, !!yval))+
    geom_smooth(method=lm, se=FALSE)+
    geom_point()+
    theme(axis.line.x.bottom = element_line("black"),
          axis.line.y.left = element_line("black"),
          axis.text.x = element_blank(),
          legend.title = element_blank())+ylab(ylabel)+
    xlab(xlabel)+
    scale_y_continuous(labels = scales::comma)+
    expand_limits(y = 0)+
    geom_smooth(method="lm", se=FALSE, colour="red")+
    annotate("text",
             x=max(eval(xval, data))/2,
             y =0,
             label = labels)
}

df <- data.frame(x = rnorm(100), y = rnorm(100))

scatter_fun(df, x, y, "x", "y", "my labels")

在此处输入图像描述

于 2020-07-17T16:14:14.460 回答