假设我们有这个玩具数据:
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()
我收到此错误:
限制错误(c(...),“y”):承诺已经在评估中: 递归默认参数引用或早期问题?
我尝试将ylim转换为一个因子,并使用eval,但它也不起作用。
我已尝试参数化其他内容,例如输入数据集,但它们运行良好,但我不明白为什么ylim没有。
有一个问题是关于aes参数的相关问题 Pass function argument to ggplot label
但其解决方案使用aes_string,此处不适用。
答案 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