无法将ylim参数传递给函数中的ggplot

时间:2017-07-03 15:25:30

标签: r function ggplot2 parameters

假设我们有这个玩具数据:

temp <- data.frame(A=1:6, gr=c("A","A","A","B","B","B"))

我可以轻松创建一个情节

lev <- c("A", "B")
ggplot()+geom_point(data=temp,aes(x=A, y=gr))+ylim(lev)

我明白了 enter image description here

但我想将其转换为函数以便轻松更改输入参数

myplot <- function(lev=lev) {ggplot()+geom_point(data=temp,aes(x=A, y=gr))+ylim(lev)}

但是当我跑步时

lev <- c("B","A")
myplot()

我收到此错误:

  

限制错误(c(...),“y”):承诺已经在评估中:   递归默认参数引用或早期问题?

我尝试将ylim转换为一个因子,并使用eval,但它也不起作用。

我已尝试参数化其他内容,例如输入数据集,但它们运行良好,但我不明白为什么ylim没有。

有一个问题是关于aes参数的相关问题 Pass function argument to ggplot label

但其解决方案使用aes_string,此处不适用。

3 个答案:

答案 0 :(得分:3)

更改定义功能的方式:

myplot <- function(lev) { #I think setting lev in the definition is causing problems
  ggplot(data=temp, aes(x=A, y=gr))+
  geom_point()+
  ylim(lev)
}

然后为这组级别设置一个新变量:

args=c("B", "A") #can reorder these however you want
myplot(lev=args)

答案 1 :(得分:2)

你没有用参数调用你的函数!

myplot() 

抛出错误,因为您没有给它提供参数。 如果你打电话给它,就像你应该打电话一样(根据你自己的定义),它就可以了。

myplot(lev) 

编辑:你可能想用lev设置参数lev的默认值?据我所知,由于R计算函数参数的方式,你会得到错误。我没有找到任何进一步的信息(在这么短的时间内),所以我很高兴看到答案更深入。 您可以直接设置默认值

myplot <- function(lev = c("A", "B)) {...}

然后您也可以在没有参数的情况下调用您的函数,即myplot()将起作用。

答案 2 :(得分:0)

我发现奇怪的是,只是使用与输入数据不同的名称来调用函数的参数。

temp <- data.frame(A=1:6, gr=c("A","A","A","B","B","B"))
mylev <- c("A", "B")

myplot <- function(lev=mylev) {ggplot()+geom_point(data=temp,aes(x=A, y=gr))+ylim(lev)}

myplot()有效

这样我可以将默认参数指向给定的定义。

PD: 仍然不能很好地运作。很奇怪。 你第一次运行它的工作原理。 但是,如果我再次运行它,我会收到此错误:

  

错误:长度(lims)== 2不为TRUE