【问题标题】:Understanding do.call semantics based on "plot"基于“情节”理解do.call语义
【发布时间】:2016-11-21 12:58:03
【问题描述】:

我在玩 do.call

I = iris
do.call(what = "plot", args = c(I$Sepal.Length ~ I$Sepal.Width))
# This seems fine

p = list(x = I$Sepal.Length, y = I$Sepal.Width)
do.call(what = "plot", args = p)
# This looks weird

p1 = list(x = I$Sepal.Length, y = I$Sepal.Width, xlab = "")
do.call(what = "plot", args = p1)
# A bit less weird


p2 = list(x = I$Sepal.Length, y = I$Sepal.Width, xlab = "", ylab = "")
do.call(what = "plot", args = p2)
# And this gives the same as the first do.call

那么,为什么我必须提供轴标签来隐藏使用do.call 时得到的所有数字?

【问题讨论】:

  • @ZheyuanLi 那应该是!=。前者调用plot.formula,后者调用plot.default。这就是轴标签不同的原因。
  • 不,它们指的是轴标签。我怀疑他们甚至没有注意到切换 x 和 y 的问题。
  • 我会写一个答案。

标签: r do.call


【解决方案1】:

首先您需要了解plot 是一个S3 generic,它根据第一个参数调用方法。如果您执行plot(y ~ x),则此方法为plot.formula,并且从公式中推断出轴标签。如果你做plot(x, y)(注意x和y的顺序不同),方法是plot.default,轴标签是从作为参数传递的符号中推断出来的。

现在,如果您使用a <- 1:2; y <- 3:4; plot(x = a, y = b),则标签为ab。然而,如果你使用do.call 魔法,do.call(plot, list(x = a, y = b) 会扩展为plot(x = 1:2, y = 3:4),因此标签是1:23:4。我建议使用带有 data 参数的公式方法,即,对于您的示例:

do.call(what = "plot", args = list(formula = Sepal.Length ~ Sepal.Width,
                                   data = I))

【讨论】:

    【解决方案2】:

    您所看到的是 R 在无法从参数中获取任何其他命名信息时放在轴标签上的内容。如果你这样做:

    plot(x=c(1,2,3,4,5,6,7,8),y=c(1,2,3,4,3,2,3,4))
    

    那么绘图将不得不使用向量值作为轴标签。

    当使用do.call 时,列表参数中的名称与被调用函数的参数名称相匹配。所以轴标签没有名字,只有值。到那时,数据来自I$Sepal.width 的事实早已不复存在,它只是一个值向量。

    【讨论】:

    • 这是我一直在寻找的答案。谢谢。
    猜你喜欢
    • 2018-01-31
    • 2023-01-11
    • 2013-11-12
    • 2021-11-13
    • 2014-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多