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

R 无法将ylim参数传递给函数中的ggplot,r,function,ggplot2,parameters,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) 我明白了 但是我想把它转换成一个函数,以便轻松地更改输入参数 myplot <- function(lev=lev) {ggplot()+geom_point

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

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)
我明白了

但是我想把它转换成一个函数,以便轻松地更改输入参数

myplot <- function(lev=lev) {ggplot()+geom_point(data=temp,aes(x=A, y=gr))+ylim(lev)}
但是当我跑的时候

lev <- c("B","A")
myplot()
我得到这个错误:

limitsc…中的错误,y:承诺已在评估中: 递归默认参数引用还是早期问题

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

我尝试过参数化其他东西,比如输入数据集,它们工作得很好,但我不明白为什么ylim不能

有一个问题涉及aes参数的相关问题


但其解决方案使用aes_字符串,不适用于此处。

更改定义函数的方式:

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)
}

更改定义函数的方式:

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)
}

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

myplot() 
抛出错误,因为您没有给出它的参数。 如果你用你自己的定义来称呼它,它就会起作用

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

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

然后,您也可以在不带参数的情况下调用函数,即myplot将起作用

您没有使用参数调用函数

myplot() 
抛出错误,因为您没有给出它的参数。 如果你用你自己的定义来称呼它,它就会起作用

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

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

然后,您也可以在不带参数的情况下调用函数,即myplot将起作用

我发现奇怪的是,只需使用与输入数据不同的名称调用函数的参数就可以了

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: 还是不行。真奇怪。 第一次运行它时,它就工作了。 但如果我再次运行it,则会出现以下错误:

错误:lengthlims==2不是真的


我发现,奇怪的是,仅仅用与输入数据不同的名称调用函数的参数是有效的

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: 还是不行。真奇怪。 第一次运行它时,它就工作了。 但如果我再次运行it,则会出现以下错误:

错误:lengthlims==2不是真的


我使用lev=lev是因为我需要一个默认参数。但这很奇怪,因为如果我在定义中使用myplottemp=temp,我就不会有同样的问题。我现在还不是很理解它。我现在已经很晚了,我不能再思考了,但这肯定与你在函数之外定义lev这一事实有关。这就是为什么将参数重命名为temp时没有问题。请参阅响应和中链接的页面。与评估框架、调用环境等有关。很抱歉,我无法解释itI,我希望名称不会冲突,因为一个是本地的,而另一个是globalI使用lev=lev,因为我需要一个默认参数。但这很奇怪,因为如果我在定义中使用myplottemp=temp,我就不会有同样的问题。我现在还不是很理解它。我现在已经很晚了,我不能再思考了,但这肯定与你在函数之外定义lev这一事实有关。这就是为什么将参数重命名为temp时没有问题。请参阅响应和中链接的页面。与评估框架、调用环境等有关。很抱歉,我无法解释itI,我希望名称不会冲突,因为一个是本地的,而另一个是globalI使用lev=lev,因为我需要一个默认参数。但这很奇怪,因为如果我在定义中使用myplottemp=temp,我没有同样的问题,我使用lev=lev,因为我需要一个默认参数。但这很奇怪,因为如果在定义中使用myplottemp=temp,我就不会遇到同样的问题