【问题标题】:Unable to pass the ylim argument to ggplot in a function无法在函数中将 ylim 参数传递给 ggplot
【发布时间】:2017-12-06 22:32:07
【问题描述】:

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

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,不适用于此处。

【问题讨论】:

    标签: r function ggplot2 parameters


    【解决方案1】:

    改变你定义你的功能的方式:

    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)
    

    【讨论】:

    • 我使用 lev=lev 因为我想要一个默认参数。但这很奇怪,因为如果我在定义中使用 myplot(temp=temp) 就没有同样的问题
    【解决方案2】:

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

    myplot() 
    

    抛出错误,因为你没有给它它的论点。 如果您按照应有的方式调用它(由您自己的定义定义),它会起作用。

    myplot(lev) 
    

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

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

    然后你也可以不带参数调用你的函数,即myplot() 可以工作。

    【讨论】:

    • 我使用 lev=lev 因为我想要一个默认参数。但这很奇怪,因为如果我在定义中使用 myplot(temp=temp) 就没有同样的问题
    • 我现在还没有真正理解它(我现在已经很晚了,我不能再想了)但它肯定与你在函数之外定义 lev 的事实有关好吧。这就是为什么将参数重命名为temp 时不会出现问题的原因。请参阅 stackoverflow.com/questions/14982223/… 以及响应中链接的页面和 cran.r-project.org/doc/manuals/r-release/… 。带有评估框架、调用环境等的东西。抱歉,我无法解释
    • 我希望名称不会冲突,因为一个是本地的,另一个是全局的
    【解决方案3】:

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

    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 不正确

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 2018-08-05
      • 2018-01-08
      • 1970-01-01
      • 1970-01-01
      • 2019-03-16
      • 1970-01-01
      • 2020-03-06
      相关资源
      最近更新 更多